2012-07-23 18 views
1

在我的控制器中我得到的所有条目形成这样findind所有使用。所有对其中

@enums = Enuemerations.all 

表再后来我想搜索并做

@enums.find(107).name 
从获取名称

我得到一个错误

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

所以,我想它在轨道控制台,发现这个工作

Enumeration.where(false).find(107) 

哪里,这并不工作

Enumeration.all.find(107) 

有人能向我解释这是如何工作?

感谢

回答

3

使用Enumeration.all即时查询数据库返回的所有枚举记录的Array(如果你只想要一个记录,这将是非常低效的)。它不再知道ActiveRecord的方法:上Array

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

调用find使用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: "...">