这让我在过去几个小时里疯狂,因为我确信必须有一个简单的解决方案。假设我有以下模型:
class Post < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :post
end
Comment模型有一个名为Flagged的属性。假设帖子有十条评论,前两条和后两条已被标记为已标记。
我想了解一个帖子的前5个评论中有多少被标记。在这种情况下,我想返回2.所以一开始我尝试了:
post.comments.limit(5).where(comments: { flagged: true }).count
但是这返回4是有意义的,因为它找到了标记为真的前5个记录。我的问题是,我怎样才能只计算有限的结果集呢?我试过了:
first_five_comments = post.comments.limit(5)
first_five_comments.where(flagged: true).count
这也返回4,因为它只是将关系链接在一起并执行与上面相同的查询。
我知道我可以使用直接的SQL语句来做到这一点,但似乎应该有更多的Rails方法来实现它。我是否必须在上面的语句中添加.all然后在返回的数组中进行计数?显然这不起作用:
first_five_comments = post.comments.limit(5).all
first_five_comments.where(flagged: true).count
因为我不能在数组上使用“where”。如果我必须像这样做,我将如何在数组中搜索得到计数?
感谢任何帮助!
答案 0 :(得分:2)
您需要过滤数组,然后计算它的元素。
post.comments.limit(5).select{ |comment| comment.flagged? }.size
或更短:
post.comments.limit(5).select(&:flagged?).size
注意:select
是Array的一种方法,它与SQL Select语句没有任何关系。