Rails 3:通过关系获取模型计数

时间:2015-04-16 15:37:13

标签: ruby-on-rails ruby-on-rails-3 postgresql

在Ruby on Rails(3)中使用PostgreSQL并给出以下三个层次模型:

class Category
    has_many :posts
end

class Post
    belongs_to :category
    has_many :comments
end

class Comment
    belongs_to :post
end

有没有办法获得每个comment的{​​{1}}总计数,而不必遍历每个category

任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:2)

是的,有。您需要做的就是按照所需的列对关系进行分组:

counts_hash = 
  Comment.
  joins(post: :category).
  group("#{Category.table_name}.id").
  count

那应该返回结构为category_id => comments_count

的哈希

但是,这将排除任何具有0条评论的类别,因为将执行内部联接。

如果您想要包含所有类别ID,无论出于何种原因,您都必须包含一些额外的步骤:

counts_hash.tap do |hash|
  Category.pluck(:id).each do |category_id|
    hash[category_id] = 0
  end
end

可替换地:

# the following will return 0 as the value of any missing key
Hash.new(0).merge(counts_hash)hash