Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使用ActiveRecord查询有限的记录集_Ruby On Rails_Activerecord_Limit_Where - Fatal编程技术网

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

Ruby on rails 如何使用ActiveRecord查询有限的记录集,ruby-on-rails,activerecord,limit,where,Ruby On Rails,Activerecord,Limit,Where,在过去的几个小时里,这让我抓狂,因为我相信一定有一个简单的解决办法。假设我有以下模型: class Post < ActiveRecord::Base has_many :comments end class Comment < ActiveRecord::Base belongs_to :post end 但这将返回4,这是有意义的,因为它将查找标记为true的前5条记录。我的问题是,如何仅对有限的结果集进行计数?我试过: first_five_comments

在过去的几个小时里,这让我抓狂,因为我相信一定有一个简单的解决办法。假设我有以下模型:

class Post < ActiveRecord::Base
    has_many :comments
end

class Comment < ActiveRecord::Base
    belongs_to :post
end
但这将返回4,这是有意义的,因为它将查找标记为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”。如果我必须这样做,我将如何在数组中搜索以获得计数


感谢您的帮助

您需要过滤数组,然后对其元素进行计数

post.comments.limit(5).select{ |comment| comment.flagged? }.size
或更短:

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

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

只是一条注释,但您说的是“first 2”和“last 2”,但您的查询没有任何顺序,所以说first/last没有真正意义。对不起,我忘记在我一直尝试的内容中添加order子句,我有“.order(:id)”谢谢,我能让最棒的一个发挥作用,我会把这个标记为答案,因为没有其他回应。我认为应该有一种方法可以在关系中执行,而不必通过数组执行。
post.comments.limit(5).select(&:flagged?).size