2010-12-13 9 views
25

Siento que este es un problema sencillo que estoy teniendo debido a mi falta de comprensión de la nueva interfaz de consulta ActiveRecord, pero toman este ejemplo:Rails 3, consulta Active Record vuelve objeto ActiveRecord :: Relation, en lugar de objetos

>> Category.first.recipes 
=> [ ... ] # array of recipes 

Sin embargo:

>> Category.where(:id => 1).recipes 
=> NoMethodError: undefined method `recipes' for #<ActiveRecord::Relation:0x000001033dc9e0> 

lo que está pasando aquí? ¿Por qué mi método where devuelve un objeto ActiveRecord::Relation? ¿cómo puedo recuperar los objetos de la consulta aquí?

Respuesta

42

Esto es realmente intencional.

Category.where(:id => 1) 
# Is Equivalent to Category.all(:conditions => {:id => 1}}) 
Category.where(:id => 1).first 
# Is equivalent of Category.first(:conditions => {:id => 1}}) 

Los objetos solo se recuperan cuando se llaman métodos especiales como el primero, cada uno, etc. Esto se denomina carga diferida, que es genial cuando quieres almacenar tus vistas en caché. Lea más sobre por qué here.

+4

voto hacia abajo porque no es equivalente. 'where' devuelve ActiveRecord :: Relation, mientras que el resto devuelve Array o Model.class –

+2

Es equivalente en el contexto. Es por eso que mencioné la carga lenta. Pero sí, '.where.all' sería equivalente. – Swanand

6
Category.where(:id => 1).recipes 

Devuelve una matriz. Si simplemente hace Category.where(:id => 1).first.recipes debería funcionar.

3

Pero si solo está haciendo un where en contra de la identificación, use el método find Category.find(1) devolverá un objeto Category. Así
:
Category.find(1).recipes

Cuestiones relacionadas