我在一对多关联中有两种实体类型:
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 上执行此操作的正确方法。
我在一对多关联中有两种实体类型:
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 上执行此操作的正确方法。
据我所知,它总是有点像 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
,比如标题、内容等。