2017-08-03 95 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