1

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

class Post < ActiveRecord::Base
    has_many :comments
end

class Comment < ActiveRecord::Base
    belongs_to :post
end

并且 Comment 模型有一个名为 Flagged 的​​属性。假设该帖子有 10 条评论,并且前两条和后两条已被标记为已标记。

我想计算一篇帖子的前 5 条评论中有多少条已被标记。在这种情况下,我想返回 2。所以起初我尝试:

post.comments.limit(5).where(comments: { flagged: true }).count

但这会返回 4,这是有道理的,因为它会找到 flagged 为 true 的前 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”。如果我必须这样做,我将如何在数组中搜索以获取计数?

任何帮助表示赞赏!

4

1 回答 1

2

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

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

或更短:

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

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

于 2012-07-23T23:58:59.707 回答