我已经包含了client_person和case_histories但是在查询case_histories时它仍然会生成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(由includes子句产生)后,它仍然逐个查询每个客户端的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 :(得分:0)
您的people_region_profile_id
表似乎同时拥有region_profile_id
和case_histories
。其中一个是在急切加载期间使用,但另一个不是。
这将有助于您列出整个模型/关系图,因为我无法构建究竟发生了什么。在我看来,你的图形看起来像这样:
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有两个不同的外键,我会遗漏一些东西。