Подтвердить что ты не робот

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? как я могу получить объекты из запроса здесь?

4b9b3361

Ответ 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