与Arel(Rails 3)的加载关联计数

时间:2010-04-08 00:23:24

标签: ruby-on-rails ruby-on-rails-3 eager-loading arel

简单的任务:鉴于文章有很多评论,能够在很长的文章列表中显示每篇文章有多少评论。我正在尝试研究如何使用Arel预加载这些数据。

README文件的“复杂聚合”部分似乎讨论了这种情况,但它并不完全提供示例代码,也没有提供在两个查询中执行此操作的方法,而不是一个加入查询,这对性能来说更糟糕。

鉴于以下内容:

class Article
  has_many :comments
end

class Comment
  belongs_to :article
end

如何为一篇文章预加载每篇文章的评论数量?

2 个答案:

答案 0 :(得分:4)

你不能为此使用计数器缓存吗?

belongs_to :article, :counter_cache => true

您还需要进行添加列comments_count

的迁移

答案 1 :(得分:2)

你可以使用SQL做一些令人讨厌的事情:

default_scope :select => 'articles.*, (select count(comments.id) from comments where comments.article_id = articles.id) as count_comments'

然后您就可以访问Article.first.count_comments。

另一种(更好的)方法是使用belongs_to关联中的'counter_cache'功能/选项。