私のコードでは、2つのモデル(投稿やコメントなど)を結合してから、3番目のモデル(作成者など)を読み込むことができます。私は各レコードを印刷するときレールは、ポストの最初のインスタンスの熱心に読み込まれたモデルデータを使用しますが、ポストの追加のインスタンスごとに追加のデータベースクエリをトリガします。これはn + 1の問題のビットです。返されたレコードごとに結合後、熱心に読み込まれたデータを使用するにはどうすればよいですか?
私が理解できないのは、なぜ私は、各投稿の最初のレコードには熱心に読み込まれたデータを使用でき、結合によって返された追加のレコードは使用できないのですか?
私は同様の質問を見てきましたが、まったく同じ問題をこれらのアドレスで感じることはありません。これらを含める:
- why is this rails association loading individually after an eager load?
- belongs_to association loaded individually even after eager loading
- Eager loading not loading in rails、およびその他
私はまた、具体的ActiveRecord::Associations::Preloader、レールのソースコードに見てきたとするビットローカルに変更しようとしています問題がどこにあるのか、ここで発生するのかを絞り込むことができるかどうかを確認してください。私はおそらくこのクラスがidによって一意ではないレコードインスタンスを取り除いていると考えていましたが(これは92行目だと思います)、私がこれを変更すると私の問題は解決されません。
私はwhacky edge caseに当てはまりましたが、実際のコードではfind_by_sql
を使用しており、これを効果的に実装することができませんでした。
私はgist with steps to reproduce the issueを作成しました。どんな助けもありがとう。
注:この例は、実際のコードで同じ問題が発生していることを示す最も簡単な設定です。私の例では、私はコメントと作者を熱心に読み込むことができますが、実際のコードではもっと複雑な結合があり、結合が必要です。私はこの例からCommentモデルを熱心に読み込むことはできません。