2017-08-03 96 views
0

我已经包含client_person和case_histories,但是在查询case_histories时它仍然会生成n + 1查询。 我已经尝试了很长时间,但似乎没有任何工作。Rails急切加载不起作用(仍然是n + 1)

@client_records = @records.includes({person: [:client_person, :case_histories]}) 

在人模型: belongs_to :client_person, class_name: 'Client::Person' has_many :case_histories, through: :region_profiles, class_name: 'Admin::PeopleCaseHistory'

生成的n + 1中的查询:

@client_records.each do |record| 
    record.person.case_histories.select{ |hist| hist.case_type == 2}.first 
end 

具体而言,后正确加载所有客户端的case_histories在列表中(从包括所得子句),它仍然是每个客户的case_histories的一个一个查询。

由产生的第一查询包括:

Admin::PeopleCaseHistory Load (46.9ms) SELECT "case_histories".* FROM "case_histories" WHERE "case_histories"."region_profile_id" IN (411, 16804, 572, 19506, 16539, 692, 4828) 

随后的N + 1的查询:

Admin::PeopleCaseHistory Load (29.5ms) SELECT "case_histories".* FROM "case_histories" INNER JOIN "region_profiles" ON "case_histories"."region_profile_id" = "region_profiles"."id" WHERE "region_profiles"."person_id" = $1 [["person_id", 9867]] 

Admin::PeopleCaseHistory Load (34.3ms) SELECT "case_histories".* FROM "case_histories" INNER JOIN "region_profiles" ON "case_histories"."region_profile_id" = "region_profiles"."id" WHERE "region_profiles"."person_id" = $1 [["person_id", 430]] 

请指教! 谢谢

+0

尝试用'参考'替换'includes' – mdesantis

+0

这不起作用 –

+0

什么是您看到的N + 1查询重复? – Smudge

回答

0

看起来您在case_histories表上看到了people_region_profile_idregion_profile_id。其中之一是在急切加载时使用,但另一个则不是。

这将有助于您列出您的整个模型/关系图,因为我无法构造到底发生了什么。在我看来,你的图形看起来是这样的:

class Person < ActiveRecord::Base 
    belongs_to :client_person 
    has_many :region_profiles 
    has_many :case_histories, through: :region_profiles 
end 

class RegionProfile < ActiveRecord::Base 
    belongs_to :person 
    has_many :case_histories 
end 

class CaseHistory < ActiveRecord::Base 
    belongs_to :region_profile 
end 

但显然我失去了一些东西,如果case_histories有两个不同的外键。

+0

抱歉,我在帖子中输入了错字。我的代码确实是record.person.case_histories.select {| hist | hist.case_type == 2} .first但是这会产生n + 1 –

+0

啊,在这种情况下,我会仔细检查你的遍历 - 确保你没有无意间通过'region_profiles'。如果这不起作用,我会加载'rails c'并手动尝试该代码 - 在运行'client_records.first.person.case_histories.to_a'等时查看查询。 – Smudge