niki12260714の日記

フリーランスのITエンジニアの呟き。

railsで親子モデルのそれぞれに条件設定してn+1問題を解決する方法

親子のモデルで結合する時、joinsかincludesを使うわけですが、取得結果表示で、「子供のループで回したい」となると、joinsだとn+1問題が発生します。
なので、includesをしたいのですが、includesは「親に対してSQL実行」→「親の結果をもとに子のSQLを実行」になるわけです。
とすると、「子が特定の条件を持つ親を取得」はエラーになる。
で、どうするか。
参考にしたのはこちら。

qiita.com

親.joins(子:[孫: [ひ孫: :玄孫]]).where("子.カラムA = ?", 値).preload(:子)

joinsした後にwhere句かけて、preloadするわけです。
※Where句の書き方は、プレイスホルダーの書き方じゃないとエラーが出たので、注意

 

これで親、子それぞれでSQL発行してくれるので、Viewで描画するときに親子でeach文回せます。

→自分課題ですが、これをさらに孫ループもしたい場合はどうすればよいのか……