Ruby on Rails 3.2.0: has_many belongs_to association で結合している場合、includeオプションを使うとよい

AR.findなどでSQLを発行する際にincludeオプションを付けると
冗長なSQLが改善されることは知っていました。
しかし
posts - posts_writers - writers - people
というようにwritersが実際にはpeopleであるような多態性を持たせたアソシエーションの場合、
Postモデルからどのようにpeopleをincludeしておけばよいか悩んだのでメモ。
結論としてはモデル側のアソシエーション定義で
includeオプションを付けるとよいことがわかりました。 
[ror]
class Post < ActiveRecord::Base
has_many: writers,<strong> :include=>person</strong>
has_many: viewers,<strong> :include=>person</strong>
end

class Writer < ActiveRecord::Base
belongs_to :post
belongs_to :person
end

class Viewer< ActiveRecord::Base
belongs_to :post
belongs_to :person
end
[/ror]

このようにすることでコントローラー側で

[ror]
@post = Post.includes(:viewers).find(params[:project_id])
[/ror]

としたときにあらかじめ関連付けられたpeopleのレコードを読み込んでくれる

[sql]
SELECT "people".* FROM "people" WHERE "people"."id"
IN (13885, 13886, 13887, 13888, 13889, 13890, 13891, 13892)
ORDER BY updated_at
[/sql]

そうするとview側で

[ror]<% @post.viewers.each do | viewer| %><%= viewer.person.name %><% end %>[/ror]

としても都度SQLを発行することはないです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です