使用ActiveRecord的直方图

时间:2013-08-18 14:18:54

标签: sql ruby-on-rails activerecord count histogram

我在一对多关联中有两种实体类型:

A --1:*--> B

我想在ActiveRecord中获得每ba的直方图。 类似的东西:

A.id   | count(B)
1      | 20
2      | 32
3      | 332
4      | 0

[ {:id=>1, :count=>20},{:id=>2,:count=>32}, ... ]

我可以直接在mySql中执行此操作,但我想知道在ActiveRecord上执行此操作的正确方法。

1 个答案:

答案 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添加其他帖子属性,例如标题,内容等。

相关问题