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
。如果使用joins
和references
而不是include,可能会提高查询的性能。这取决于你是在视图/响应中使用project
还是organization
。