0

Commentテーブルをクエリするときに sをeager-loadしようとしていActivityます。

# Activity (basic FB-style news feed)
#   user_id
#   primary_source_id (polymorphic object, like "Post", that can have comments)
#   primary_source_type

# Comment (acts as commentable w/ threading gem)
#   user_id
#   commentable_id
#   commentable_type

# WHAT GOES HERE?!
# How do I eager-load comments?
activities = Activity.includes(???).joins(???)

# Display code
activities.each do |activity|
  render ... # render activity
  activity.root_comments.each do |comment|
    render ... # render activity's comments
  end
end

Activitys をループし、それぞれprimary_source( a などPost) とそのsを取得して、ページをレンダリングしますComment。現在、primary_sourceは熱心にロードされていますが、Commentはそうではありません。各ループがCommentテーブルにヒットします。これは私にとって大きなパフォーマンス ヒットであり、表示する s の数に比例してスケーリングしActivityます。

を熱心にロードするにはどうすればよいCommentですか?

4

1 に答える 1

3

すべての primary_sources がコメント可能であると仮定すると、

activities = Activity.includes(:user, :primary_source => :comment_threads).where...

...私のために働いた。データベースへのアクセスを回避する (およびインクルードの目的を無効にする) には、root_comments への参照をすべて comment_threads (子コメントを含む) に置き換える必要があります。これは、root_comments がヘルパー メソッドとして実際に gem (lib/acts_as_commentable_with_threading.rb) で定義されているためです。

def root_comments
  self.comment_threads.where(:parent_id => nil)
end

出典:ネストされたアソシエーションに関するRails ガイドのセクション、acts_as_commentable_with_threading gem の内部の覗き見、およびコンソールでの試行錯誤:)

于 2012-05-29T21:38:51.680 に答える