Rails 3, запрос Active Record возвращает ActiveRecord:: объект привязки вместо объектов
Мне кажется, что это простая проблема, из-за моего непонимания нового интерфейса запросов ActiveRecord, но возьмите этот пример:
>> Category.first.recipes
=> [ ... ] # array of recipes
Однако:
>> Category.where(:id => 1).recipes
=> NoMethodError: undefined method `recipes' for #<ActiveRecord::Relation:0x000001033dc9e0>
Что здесь происходит? почему мой метод where
возвращает объект ActiveRecord::Relation
? как я могу получить объекты из запроса здесь?
Ответы
Ответ 1
Это действительно намеренно.
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}})
Объекты извлекаются только при вызове специальных методов, таких как first, each и т.д. Это называется ленивой загрузкой, что отлично, когда вы хотите кэшировать свои представления. Подробнее о том, почему здесь.
Ответ 2
Category.where(:id => 1).recipes
Возвращает массив. Если вы просто выполняете Category.where(:id => 1).first.recipes
, он должен работать.
Ответ 3
Но если вы просто делаете что-то против id, используйте метод find
Category.find(1)
вернет объект Category.
Итак:
Category.find(1).recipes