找到所有使用.all与where

时间:2012-07-23 10:41:52

标签: ruby-on-rails-3 activerecord

在我的控制器中,我收到的所有条目都是这样的表格

@enums = Enuemerations.all

然后我想通过

搜索并获取名称
@enums.find(107).name

我收到错误

undefined method `name' for #<Enumerator:0xb5eb9d98>

所以我在rails控制台中试了一下,发现这个工作

Enumeration.where(false).find(107)

这不起作用

Enumeration.all.find(107)

有人可以向我解释这是如何运作的吗?

由于

1 个答案:

答案 0 :(得分:3)

使用Enumeration.all立即查询数据库,返回带有所有Enumeration记录的Array(如果您只想要一条记录,这将是非常低效的)。它不再了解ActiveRecord方法:

 > Enumeration.all.class
  Enumeration Load (0.1ms)  SELECT "enumerations".* FROM "enumerations" 
 => Array 

find上拨打Array使用需要不同语法的Enumerable#find,例如:

enums = Enumeration.all
enum = enums.find { |e| e.id == 2 }
 => #<Enumeration id: 2, name: "...">

使用Enumeration.where(false)只返回一个懒惰的ActiveRecord::Relation,它实际上并没有打到数据库(但是),这允许你在上面的例子中链接额外的ActiveRecord方法,例如find

> Enumeration.where(false).class
 => ActiveRecord::Relation 

> Enumeration.where(false).find(2)
  Enumeration Load (0.2ms)  SELECT "enumerations".* FROM "enumerations" WHERE "enumerations"."id" = ? LIMIT 1  [["id", 2]]
 => #<Enumeration id: 2, name: "...">