1

我有一个帖子模型,并发布 has_many :comments, :as => :commentable (多态)。我正在寻找一种可以获取所有帖子的方法,并在记录上有一个虚拟属性,该属性将显示该帖子有多少评论。

我在想我可以这样做:

Post.select("posts.*, count(comments.id) as post_comments").joins(:comments)

但是,这只返回一条记录,post_comments 设置为整个数据库中的所有评论,而不仅仅是那些属于该记录的评论......

4

3 回答 3

6

实际上,您缺少的是组子句。您需要按站点分组,否则 count() 聚合会将所有内容折叠为一条记录,如您所见。

尝试这个:

Post.select("posts.*, count(comments.id) as post_comments")
    .joins(:comments)
    .group('posts.id')
于 2012-08-16T11:46:11.510 回答
3

我认为问题在于您count(comments.id)只计算了整个连接表。您可以使用嵌套查询解决此问题:

Post.select("posts.*, (SELECT count(comments.id) FROM comments WHERE comments.post_id=posts.id) AS post_comments")

在这种情况下,您不需要连接,因为外部查询中没有使用 comments 表。

于 2012-04-03T21:17:10.730 回答
-1

我会用 Post 模型中的变量来做到这一点。第一个我会尝试以某种方式找到我正在寻找的帖子(你可以通过你想要的任何参数找到它,下面我展示了搜索 id 参数的示例)。

@post = Post.find(params[:id])

当你找到你要找的帖子时,找出评论号很容易,尝试类似...

@comments = @post.comments.size

...wich将返回一个整数。

于 2012-04-03T19:58:47.677 回答