web-dev-qa-db-fra.com

Rails 3, Active Record Query renvoie Activerecord :: Objet de relation, au lieu d'objets

J'ai l'impression que ceci est un simple problème que je suis dû à mon malentendu de la nouvelle interface de requête Activerecord, mais prenez cet exemple:

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

Toutefois:

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

Que se passe t-il ici? Pourquoi ma méthode where renvoie-t-elle ActiveRecord::Relation objet? Comment puis-je récupérer les objets de la requête ici?

29
JP Silvashy

Ceci est en fait intentionnel.

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}})

Les objets ne sont récupérés que lorsque des méthodes spéciales telles que la première, chaque etc. sont appelées. Ceci est appelé chargement paresseux qui est un excellent lorsque vous souhaitez mettre en cache votre point de vue. En savoir plus sur pourquoi ici .

43
Swanand
Category.where(:id => 1).recipes

Retourne un tableau. Si vous faites simplement Category.where(:id => 1).first.recipes cela devrait fonctionner.

6
Austin Lin

Mais si vous faites juste un endroit où contre l'identifiant, utilisez la méthode de recherche Category.find(1) retournera un objet de catégorie.
Donc:
Category.find(1).recipes

4
cpuguy83