如何使用ActiveRecord查询有限的记录集

时间:2012-07-23 23:39:50

标签: ruby-on-rails activerecord limit where

这让我在过去几个小时里疯狂,因为我确信必须有一个简单的解决方案。假设我有以下模型:

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”。如果我必须像这样做,我将如何在数组中搜索得到计数?

感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

您需要过滤数组,然后计算它的元素。

post.comments.limit(5).select{ |comment| comment.flagged? }.size

或更短:

post.comments.limit(5).select(&:flagged?).size

注意:select是Array的一种方法,它与SQL Select语句没有任何关系。