我了解了size
,count
和length
here的使用差异。当我像这样使用它时有意义:
@posts = Post.all
puts "length: ", @posts.length
puts "count: ", @posts.count # Makes a database call to count records
puts "size: ", @posts.size
这三个都返回正确的长度。但是,如果我替换@posts = Post.all
在上面的代码段中使用@posts = Post.find_by(post_type: 'article')
,我发布了noMethodError
#<Post:>
错误
find_by
结果?答案 0 :(得分:3)
当您使用Post.all
时,它会返回ActiveRecord::Relation
个实例 - 其行为与Array
非常相似。因此,您可以使用Array
,count
或length
执行size
操作。
但length
选择所有记录,加载到内存中并计为常规Array
。因此使用它效率低下并且气馁。
但是当你使用find_by
时,它会返回符合指定条件的第一条记录。因此,length
,count
或size
无效。
你可以阅读here。
如果要获取与查询匹配的所有记录,最好使用where
Post.where(post_type: 'article').count
您可以详细了解如何使用条件here.
答案 1 :(得分:2)
find_by
方法仅用于查找一条记录。您应该使用where
代替:
Post.where(post_type: 'article').count
答案 2 :(得分:1)
为什么这些方法不适用于find_by结果?
find_by
仅返回第一个匹配的记录,您无法在对象.count
上运行#<Post:>
您可以将where
用于此目的
Post.where(post_type: 'article').count