在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
?
任何帮助将不胜感激,谢谢!
答案 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