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での条件しても行える