2017-08-03 3 views
0

私は長い間試しましたが、何も動作していないようです。人物モデルで私はclient_personとcase_historiesをインクルードしましたが、case_historiesをクエリするとn + 1のクエリが生成されます。(まだ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について依然として1つずつ問い合わせを行います。

含んによって生成された最初のクエリ:

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 'を' references'に置き換えようとします – mdesantis

+0

これはうまく動作しません –

+0

繰り返しているN + 1クエリは何ですか? – Smudge

答えて

0

people_region_profile_idregion_profile_idの両方があなたのcase_historiesテーブルにあるようです。そのうちの1つは熱心なローディング中に使用されていますが、もう1つは使用されていません。

正確に何が起こっているのかを構築することができないため、モデル/リレーションのグラフ全体を一覧表示するのに役立ちます。

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は、2つの異なる外部キーを持っている場合、明らかに、私は何かが欠けている:あなたのグラフは次のようになりますように私には思えます。

+0

申し訳ありません私は投稿でタイプミスをしました。私のコードは確かにrecord.person.case_histories.select {| hist | hist.case_type == 2}。しかし、これはn + 1を生成します。 –

+0

ああ、その場合、私はあなたのトラバーサルを二重にチェックします - 誤って 'region_profiles'を踏んでいないことを確認してください。それがうまくいかない場合は 'rails c'を手動で読み込み、手動でコードを試してみましょう。' client_records.first.person.case_histories.to_a'などを実行すると、クエリを監視します。 – Smudge

関連する問題