Railsのincludesとjoinsの本質的な違い
処理の範囲が違う
includes は先読みを行いキャッシュする → Railsのメモリに影響する(しない場合もある)
joins は INNER JOIN する → データベース内だけの話
関連先のデータを使いたいときはincludesを使うが、関連先の条件で絞り込みたい場合はjoinsを使う。メモリのこととか、速度のこととか、ここから考えていけばある程度応用が効く。
例:ユーザーのいいねした順でBookを取得したい
joinsを使う方がスマート
1user.books.joins(:likes).all.order('likes.created_at DESC').to_sql
2=> "SELECT \"books\".* FROM \"books\" INNER JOIN \"likes\" ON \"likes\".\"book_id\" = \"books\".\"id\" WHERE \"books\".\"user_id\" = 5 ORDER BY likes.created_at DESC"