Rails急切加载不起作用(仍为n + 1)

时间:2017-08-03 13:49:55

标签: ruby-on-rails ruby activerecord eager-loading

我已经包含了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]]

请指教! 感谢

1 个答案:

答案 0 :(得分:0)

您的people_region_profile_id表似乎同时拥有region_profile_idcase_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有两个不同的外键,我会遗漏一些东西。