我在一对多关联中有两种实体类型:
A --1:*--> B
我想在ActiveRecord中获得每b
个a
的直方图。
类似的东西:
A.id | count(B)
1 | 20
2 | 32
3 | 332
4 | 0
[ {:id=>1, :count=>20},{:id=>2,:count=>32}, ... ]
我可以直接在mySql中执行此操作,但我想知道在ActiveRecord上执行此操作的正确方法。
答案 0 :(得分:1)
据我所知,AR和SQL总是混合搭配。
假设您要为每个帖子计算评论。以下代码:
Post.joins(:comments).group("posts.id").count("comments.id")
会产生类似的东西:
{2=>304, 3=>329, 4=>46, 6=>342}
其中哈希键是post id。但请注意,由于joins
强制执行内部联接,您只能获得包含现有注释的帖子。但是,就像在您的示例中一样,列出具有零注释的帖子ID也是有意义的。
然后您可以考虑include
,而不是加入评论:
Post.includes(:comments).group("posts.id").count("comments.id")
但这不起作用。由于我不完全确定的原因,AR会忽略includes
,这会导致数据库错误。
最后,我使用了以下更明确的和sql-ish查询:
Post.select("posts.id, COUNT(comments.id) AS comm_count")
.joins("LEFT OUTER JOIN comments ON posts.id=comments.post_id")
.group("posts.id")
这将返回一系列实际的Post模型(不只是:id => count
哈希),其中添加了属性comm_count
,这正是您所需要的。
当然,您可以向select
添加其他帖子属性,例如标题,内容等。