はやいもので、ローカルインターンに来始めてからもうすぐ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_type
がArticle
のものについては、comment.article
でarticleオブジェクトにアクセスできる。さらに、
comments = Comment.includes(:article).where('articles.user_id = 10')
のようなクエリを発行することも可能になる。これによって、
にあるように、includes
の長所(あまり詳しくないがeager loadingというらしい)を活用することができる。
ただ、article
オブジェクトを用いる必要があまりない場合、つまり、article
の情報をCommentのクエリのみに用いる場合は、joins
でleft join
を使う以下の説明にあるコードのほうが、簡潔なSQLを発行出来て(comment.commentableに何回もアクセスしない場合は)速度的にも有利。
クエリの結果をどのように利用するかで、最適解が変わってくるということかな・・。
ご意見、ツッコミお待ちしております><
eager loadingについて調べてみる。
せっかくeager loadingが出てきたので、掘り下げて調べてみる。とりあえず参考リンク。