Rails

includesとjoinsを一緒に使用した方が良い場合

使用するサンプルモデル

この記事で使用するサンプルモデルを以下に示します。

class User < ActiveRecord::Base
  has_many :articles
end

class Article < ActiveRecord::Base
  belongs_to :user
end

includesとjoinsの使い分け

includesを使うと結果をキャッシュします。そのため、親から子レコードを参照する場合にincludesを使用するとパフォーマンスが向上します。例えば、以下のように使用します。

users = User.includes(:articles)
users.each do |user|
  user.articles
end

一方、joinsを使うとINNER JOINを行います。子レコードで親レコードを絞る場合などに使用します。User.joins(:articles).where(articles: {status: :published})のようなイメージです。

includesとjoinsを一緒に使う場合

「親から子レコードを参照する」かつ「子レコードで親レコードを絞る」ことをやりたい場合にincludesとjoinsを一緒に使うと良いです。例えば、User.includes(:articles).joins(:articles).where(articles: {status: :published})のように使用します。