我有一个帖子模型,并发布了has_many:comments,:as => :可评论(多态)。我正在寻找一种方法,我可以获取所有帖子,并在记录上有一个虚拟属性,它将显示该帖子有多少条评论。
我以为我可以做:
Post.select("posts.*, count(comments.id) as post_comments").joins(:comments)
但是,只返回一条记录,post_comments设置为整个数据库中的所有注释,而不仅仅是属于记录的那些...
答案 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
...将返回一个整数。