2

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

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 上执行此操作的正确方法。

4

1 回答 1

1

据我所知,它总是有点像 AR 和 SQL 的混合搭配。

假设您要计算每个帖子的评论数。以下代码:

Post.joins(:comments).group("posts.id").count("comments.id")

会产生类似的东西:

{2=>304, 3=>329, 4=>46, 6=>342}

其中哈希键是帖子 ID。但是请注意,由于您强制执行的内部连接,joins您只会获得包含现有评论的帖子。但是,就像在您的示例中一样,列出评论为零的帖子 ID 也是有意义的。

然后,您可能会想到include,而不是加入评论:

Post.includes(:comments).group("posts.id").count("comments.id")

但这行不通。由于我不完全确定的原因includes,AR 会忽略它,这会导致数据库错误。

最后,我使用了以下更明确的 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,比如标题、内容等。

于 2013-09-28T12:37:49.247 回答