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>
endclass Writer < ActiveRecord::Base
belongs_to :post
belongs_to :person
endclass 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を発行することはないです。
Ruby on Rails 3.2.0: has_many belongs_to association で結合している場合、includeオプションを使うとよい
コメントを残す