2010-12-13 20 views
25

Je me sens comme cela est un problème simple que je vais avoir à cause de mon incompréhension de la nouvelle interface de requête ActiveRecord, mais prenez cet exemple:Rails 3, retourne la requête Active Record ActiveRecord :: objet Relation, au lieu d'objets

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

Cependant:

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

Qu'est-ce qui se passe ici? Pourquoi ma méthode where renvoie-t-elle un objet ActiveRecord::Relation? comment puis-je récupérer les objets de la requête ici?

Répondre

42

Ceci est réellement intentionnel. 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. C'est ce qu'on appelle le chargement paresseux, ce qui est génial lorsque vous voulez mettre en cache vos vues. En savoir plus sur pourquoi here.

+4

vote down parce que son équivalent non. 'where' renvoie ActiveRecord :: Relation, tandis que le reste renvoie Array ou Model.class –

+2

Il est équivalent dans le contexte. C'est pourquoi j'ai mentionné le chargement paresseux. Mais oui, «où» tout serait équivalent. – Swanand

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

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

3

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