Polymorphicのincludes,join、eager loading、そろそろ1ヶ月

/ 20日目/ 5週目・学習週 コメント

はやいもので、ローカルインターンに来始めてからもうすぐ1ヶ月です。 時が立つのは早い。次何するかそろそろ決めないと・・・。

polymorphicでのincludesとjoinについて

の続き。今までに理解できたことをまとめてみる。

にあるように、

class Comment < ActiveRecord::Base
  belongs_to :commentable, polymorphic: true
  belongs_to :article,
    foreign_key: 'comemntable_id',
    conditions: "comments.commentable_type = 'Article'"
end

のように書いておけば、commentオブジェクトのうち、commentable_typeArticleのものについては、comment.articleでarticleオブジェクトにアクセスできる。さらに、

comments = Comment.includes(:article).where('articles.user_id = 10')

のようなクエリを発行することも可能になる。これによって、

にあるように、includesの長所(あまり詳しくないがeager loadingというらしい)を活用することができる。

ただ、articleオブジェクトを用いる必要があまりない場合、つまり、articleの情報をCommentのクエリのみに用いる場合は、joinsleft joinを使う以下の説明にあるコードのほうが、簡潔なSQLを発行出来て(comment.commentableに何回もアクセスしない場合は)速度的にも有利。

クエリの結果をどのように利用するかで、最適解が変わってくるということかな・・。

ご意見、ツッコミお待ちしております><

eager loadingについて調べてみる。

せっかくeager loadingが出てきたので、掘り下げて調べてみる。とりあえず参考リンク。

コメント