🧐
【Rails】includesではなくpreloadやeager_loadを使った方が良い理由
初めに
includesについての議論があったので、備忘録としてまとめておきます。
includesを避ける理由
includesの挙動はデフォルトではpreloadと同様だが、他テーブルを結合処理していたり関連先テーブルで絞り込みを行っている場合はeager_loadの挙動になる。つまり意図しない挙動を起こす可能性がある。したがってincludesはなるべく避けた方が良さそう...
preloadとeager_loadの使い分け
各種参考記事でも紹介されていますが、アソシエーションに応じて使い分けるのが良さそうです!
preload
N対N なら 要は複数の関連先を事前読み込みさせたい場合なんかですね。
User.preload(:posts)
# SELECT "posts".* FROM "posts" WHERE "posts"."user_id" IN (1, 2, 3)
eager_load
1対1 or N対1 なら 1クエリでデータを取得した方が効率が良さそうな場合。
User.eager_load(:posts)
# SELECT "users"."id" AS t0_r0, "users"."name" AS t0_r1, ...
# FROM "users" LEFT OUTER JOIN "posts" ON "posts"."user_id" =
# "users"."id"
参考記事
Discussion