自由帳

既に知っていることも含めて再アウトプット用に書きます✍️

N+1のメモ

メソッド名 発行SQL キャッシュの生成 メモ
joins LEFT INNER JOIN 遅延フェッチを行う。
left_outer_joins LEFT OUTER JOIN 関連テーブルでの絞り込み
eager_load LEFT OUTER JOIN LEFT OUTER JOIN でキャッシュする。1 回のクエリで行う。即時にフェッチされる。
preload SELECT句をモデル毎に1回ずつ キャッシュする。クエリは複数回に分かれる。即時にフェッチされる。(JOIN は行われない。)
includes LEFT OUTER JOINまたは、SELECT句をモデル毎に1回ずつ where / joins / references / eagar_load と組み合わせた場合には、eagar_load と同じ動作を行い、それ以外の場合には preload を行う。
joins + preload LEFT INNER JOIN LEFT INNER JOIN を行う。クエリは複数回に分かれる。即時にフェッチされる。
joins + eagar_load LEFT INNER JOIN LEFT INNER JOIN を行う。1 回のクエリで行う。即時にフェッチされる。

includesメソッドについて

includesメソッドでは以下の条件に合致する場合にはeager_loadの挙動を、合致しない場合はpreloadの挙動を行います。

  1. 引数に指定した関連テーブルに対しjoinsメソッドを使用している場合
  2. 引数に指定した関連テーブルに対しwhereメソッドを使用している場合
  3. 引数に指定した関連テーブルに対しreferencesメソッドを使用している場合

includesメソッドは状況に応じてよしなに挙動を変えてくれる。 しかし、コードの意図が伝わりづらいので、できるだけeager_loadpreloadを使うのが望ましいです。

github.com