よくあるpreload, includes, eager_loadの違いについて実際に打ってみて確認してみた。今回はuserレコードがtaskレコードに対して1対多のERにおいてuserとそれに紐づくtaskを取得するようなクエリの挙動を確認します。

クエリ2回に分けられるパターン

実際のクエリはこんな感じでusersのID配列でtasksを検索している

JOINしてくれるパターン

SELECT句がワイルドカード記述ではなくなり、LEFT OUTER JOINしてくれます。

WHERE句にカラムねーよ、って言われるパターン

以下のようにincludesを使ったJOINでwhere句にハッシュを使わない場合に、includesしたテーブルのカラムを条件にするとエラーになります。

where句がハッシュの場合は色々と空気を読んでLEFT OUTER JOINしてくれるけど、文字列はWHERE句にそのまま入れるだけっぽいです。クエリ2回パターンと同様に、usersテーブルを取得しようとした際にtasksのカラムで絞込をしようとして、エラーになっています。

参考URL

ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い – Qiita