2010-12-13 7 views
25

Czuję, że jest to prosty problem mam z powodu mojego niezrozumienia nowego interfejsu zapytań ActiveRecord, ale wziąć ten przykład:szyn 3, Active Record kwerenda zwraca obiekt ActiveRecord :: relacji, zamiast obiektów

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

Jednakże:

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

Co tu się dzieje? dlaczego moja metoda zwraca obiekt ActiveRecord::Relation? jak mogę pobrać obiekty z zapytania tutaj?

Odpowiedz

42

To jest rzeczywiście zamierzone.

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

Obiekty są pobierane tylko wtedy, gdy wywoływane są specjalne metody, takie jak pierwsza, każda itd. Nazywa się to "Lazy loading", co jest świetne, gdy chcesz cacheować swoje widoki. Przeczytaj więcej o tym, dlaczego here.

+4

Głosowanie w dół, ponieważ nie jest równoważne. 'where' zwraca ActiveRecord :: Relation, a reszta zwraca Array lub Model.class –

+2

Jest to odpowiednik w kontekście. Dlatego wspomniałem o leniwym ładowaniu. Ale tak, ".where.all" będzie równoznaczne. – Swanand

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

Zwraca tablicę. Jeśli po prostu wykonasz Category.where(:id => 1).first.recipes, to powinno działać.

3

Ale jeśli robisz tylko miejsce z identyfikatorem, użyj metody find: Category.find(1) zwróci obiekt kategorii.
A więc:
Category.find(1).recipes

Powiązane problemy