如何在rails中的选择查询中添加虚拟“计数”列?

时间:2012-04-03 19:48:56

标签: ruby-on-rails activerecord

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

我以为我可以做:

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

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

3 个答案:

答案 0 :(得分:5)

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

试试这个:

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

答案 1 :(得分:3)

我认为问题是你的count(comments.id)只对整个联接表进行了计数。您可以使用嵌套查询解决此问题:

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

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

答案 2 :(得分:-1)

我会用Post模型中的变量做到这一点。第一,我会尝试找到我想找的帖子(你可以通过你想要的参数找到它,下面我用搜索id参数显示例子)。

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

当你找到你想要的帖子时,找出评论号码很容易,尝试一下......

@comments = @post.comments.size

...将返回一个整数。