🧐

【Rails】includesではなくpreloadやeager_loadを使った方が良い理由

2022/11/24に公開

初めに

includesについての議論があったので、備忘録としてまとめておきます。

includesを避ける理由

includesの挙動はデフォルトではpreloadと同様だが、他テーブルを結合処理していたり関連先テーブルで絞り込みを行っている場合はeager_loadの挙動になる。つまり意図しない挙動を起こす可能性がある。したがってincludesはなるべく避けた方が良さそう...

https://railsdoc.com/page/includes

preloadとeager_loadの使い分け

各種参考記事でも紹介されていますが、アソシエーションに応じて使い分けるのが良さそうです!

N対N なら preload

要は複数の関連先を事前読み込みさせたい場合なんかですね。

User.preload(:posts)
# SELECT "posts".* FROM "posts" WHERE "posts"."user_id" IN (1, 2, 3)

https://railsdoc.com/page/preload

1対1 or N対1 なら eager_load

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"

https://railsdoc.com/page/eager_load

参考記事

https://qiita.com/ryosuketter/items/097556841ec8e1b2940f#主な違い
https://tech.stmn.co.jp/entry/2020/11/30/145159
https://zenn.dev/yukihaga/articles/aee4c55332a103

Discussion