【发布时间】:2017-08-03 13:49:54
【问题描述】:
我已经包含了 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。
由 include 生成的第一个查询:
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]]
请指教! 谢谢
【问题讨论】:
-
尝试用
references替换includes -
这不起作用
-
您看到重复的 N+1 查询是什么?
-
@Smudge 我在帖子中添加了 N+1 查询
-
更新了我的答案,但可能仍需要更多信息
标签: ruby-on-rails ruby activerecord eager-loading