Ruby on Rails:计算find_by *方法返回的记录

时间:2016-07-27 06:16:10

标签: ruby-on-rails doctrine rails-activerecord

我了解了sizecountlength 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结果?
  • ActiveRecord中的find_by与Doctrine中的findBy()不相似吗?如果不是等价物。

3 个答案:

答案 0 :(得分:3)

当您使用Post.all时,它会返回ActiveRecord::Relation个实例 - 其行为与Array非常相似。因此,您可以使用Arraycountlength执行size操作。

length选择所有记录,加载到内存中并计为常规Array。因此使用它效率低下并且气馁。

但是当你使用find_by时,它会返回符合指定条件的第一条记录。因此,lengthcountsize无效。 你可以阅读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