Rails 3, запрос Active Record возвращает объект ActiveRecord :: Relation вместо объектов - PullRequest
28 голосов
/ 13 декабря 2010

Мне кажется, что это простая проблема, возникшая у меня из-за моего неправильного понимания нового интерфейса запросов ActiveRecord, но возьмем такой пример:

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

Однако:

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

Что тут происходит?почему мой метод where возвращает объект ActiveRecord::Relation?Как я могу получить объекты из запроса здесь?

Ответы [ 3 ]

43 голосов
/ 13 декабря 2010

Это на самом деле преднамеренно.

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, каждый и т. Д.Это называется отложенной загрузкой, которая отлично подходит для кэширования ваших просмотров.Подробнее о том, почему здесь .

6 голосов
/ 13 декабря 2010
Category.where(:id => 1).recipes

Возвращает массив.Если вы просто сделаете Category.where(:id => 1).first.recipes, это должно сработать.

4 голосов
/ 20 октября 2011

Но если вы просто делаете где против идентификатора, используйте метод find Category.find(1) вернет объект Category.
Итак:
Category.find(1).recipes

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...