関連モデルの関連モデルを参照する場合のN+1問題の解消方法で少しハマったのでφ(..)メモメモ
問題
例えば、下記のようなClassがあった場合にtask.user.group
を取得しようとするとGroupの読み込み処理によりN+1問題が発生する。
そのためTaskを取得する際にはTask.all.includes(:user, :group)
といった対策が考えられるが、group
はタスクにassociationとして定義されていないので、指定出来ない。。。
class Task < ApplicationRecord belongs_to :user, required: false belongs_to :owner, class_name: 'User' end class User < ApplicationRecord has_many :tasks has_one :user_group has_one :group, through: :user_group end class UserGroup < ApplicationRecord belongs_to :user belongs_to :group end class Group < ApplicationRecord has_many :user_groups has_many :users, through: :user_groups end
解決策
下記のようにincludes(user: :group)
とすることで、関連モデルのassociationを使ってincludesを行うことが出来る🙌
Task.all.includes(user: :group)