ActiveRecord包含并引用查询



Rails正在使用"includes"one_answers";references"来解决N+1个查询,我们都知道。然而,当我今天测试我的查询时,我遇到了一个问题。以下是我的rails应用程序中的一些模型。

class Organization < ApplicationRecord
has_many :projects, dependent: :destroy
end
class Project < ApplicationRecord
belongs_to :organization
has_many :routes, dependent: :destroy
end
class Route < ApplicationRecord
belongs_to :project
end

正如我们在这里看到的,我们建立了一个嵌套关系。我的查询如下:

routes = Route.includes(project: :organization).where("organizations.name like ?", "blablabla").references(project: :organization)

这个查询可以像我期望的那样成功地获取路由记录。但是,我也试过:

routes = Route.includes(project: :organization).where("organizations.name like ?", "blablabla").references(:projects)

routes = Route.includes(project: :organization).where("organizations.name like ?", "blablabla").references("xxxxxx")

后两个查询都可以工作并获得我想要的路由记录。从我的理解来看,";"包括";"必须使用"参考"。和";references"表示要在查询语句中连接的表。但似乎只要我传递一个参数给references",不管这个参数是什么,它都可以工作。

从ActiveRecord源代码来看,它看起来像"只检查是否传递了table_names。

def references(*table_names)
check_if_method_has_arguments!(:references, table_names)
spawn.references!(*table_names)
end
def references!(*table_names) # :nodoc:
self.references_values |= table_names
self
end

有谁能详细说明这是怎么"引用"的吗?工作吗?

由于您正在调用includes,它已经加入了那些表。如果使用joins连接表,则需要references。如果使用joinsreferences而不是include,可能会提高查询的性能。这取决于你是在视图/响应中使用project还是organization

相关内容

  • 没有找到相关文章

最新更新