2

私のコントローラーでは、このようなテーブルからすべてのエントリを取得しています

@enums = Enuemerations.all

その後、検索して名前を取得したい

@enums.find(107).name

エラーが発生する

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

Railsコンソールで試してみたところ、これが機能していることがわかりました

Enumeration.where(false).find(107)

これが機能しない場所

Enumeration.all.find(107)

誰かがこれがどのように機能するかを説明できますか?

ありがとう

4

1 に答える 1

4

データベースをEnumeration.all即座にクエリして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)すると lazy が返され、ActiveRecord::Relation実際にはデータベースにヒットしません (まだ)。これにより、find上記の例のように、追加の ActiveRecord メソッドをチェーンできます。

> 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: "..."> 
于 2012-07-23T10:58:42.710 に答える