LoginSignup
0
0

preload, eager_load, include の違い

Posted at

preload, eager_load, includeとは

N+1を解消する、ActiveRecordのメソッド

前提

下記、違いについての説明は、この2モデルが存在すると仮定する
usersモデル、postsモデルの2テーブルある
postsモデルはusersモデルに紐づいている

preload

二つのクエリを発行し、関連するモデルを取得する
クエリをモデルごとに発行するため、where旬の条件としては使えない
JOINをするわけではないので、条件を指定しないのであれば、比較的軽量

users = users.all.preload(:posts)

上記は、usersに対してのall、usersに紐づくpostsの取得、この二つのクエリを発行している

eager_load

関連するモデルに対して、LEFT OUTER JOINする
JOINするため、条件として使用可能
大規模なテーブルになった場合、JOINする数が多くなり、複雑になり、パフォーマンスに影響する可能性あり

users = users.all.eager_load(:posts).where('posts.text = ?', 'hogehoge')

上記は、usersに対してのallし、関連するpostsモデルをLEFT OUTER JOINしている
JOINしているため、検索条件にpostsモデルを指定できる

include

preloadとeager_loadどちらが効率がいいかを判断し、よしなにやってくれる
大量にデータがある場合には注意が必要らしいが今のところみたことはない

users = users.all.include(:posts)
上記は、whereでの条件しても行える
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0