初めて親から孫をegaer loadingしたのでメモ。 「users(親) - posts(子) - comments(孫)」といったテーブル構造で、親のレコードを取得しインスタンスに詰めた後、モデルの関連付けを利用して子(post)と孫(comment)のレコードを取得する時に、効率的なSQLが発行されるよう親レコードの取得の際にeager loadingでテーブルをjoinしておく。

# user.rb
class User < ActiveRecord::Base
  has_many :posts
end

# post.rb
class Post < ActiveRecord::Base
  belongs_to :user
  has_many :comments
end

# comment.rb
class comment < ActiveRecord::Base
  belongs_to :post
end
user = User.find(1).includes(posts: [:comments])

posts = user.posts
comments = user.posts.comments

発行されるSQL


参考サイト

ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い