Arel とのイーガーローディング アソシエーション カウント (Rails 3)
-
25-09-2019 - |
質問
簡単なタスク:記事に多くのコメントがある場合、各記事にコメント数がいくつあるかを記事の長いリストに表示できるようになります。Arel でこのデータをプリロードする方法を考え中です。
「複雑な集計」セクション お読みください このファイルではそのような状況について説明しているようですが、サンプル コードが正確に提供されているわけではありません。また、パフォーマンスが悪化する 1 つの結合クエリではなく 2 つのクエリで実行する方法も提供していません。
以下のことを考えると:
class Article
has_many :comments
end
class Comment
belongs_to :article
end
記事ごとにコメント数を設定してプリロードするにはどうすればよいですか?
解決
次のような SQL を使用すると、厄介なことができます。
default_scope :select => 'articles.*, (select count(comments.id) from comments where comments.article_id = articles.id) as count_comments'
そうすれば、Article.first.count_comments にアクセスできるようになります。
これを行うための別の (より良い) 方法は、「counter_cache」機能/オプションを使用することです。 属する 協会。
他のヒント
あなたがこのためにカウンターキャッシュを使用することができませんか?
belongs_to :article, :counter_cache => true
また、列を追加し、移行を持っている必要がありcomments_count
所属していません StackOverflow