Find возвращает Enumerator, а не объект - PullRequest
3 голосов
/ 18 июня 2011

Я работаю над приложением Rails 3, и у меня есть строка в одном из моих контроллеров, которая выглядит следующим образом:

@features = Feature.find(:all, :conditions => ['featured_at < ?', Time.current], :order => 'featured_at ASC')
@feature = @features.find(params[:feature])

Идея состоит в том, чтобы получить набор «функций» из БД с учетом некоторых ограничений, а затем выбрать один из них из этого набора. Если рассматриваемая запись существует в БД, но не соответствует ограничениям, я НЕ хочу ее возвращать. Таким образом, я делаю @features.find, а не Feature.find.

Проблема, с которой я столкнулся, заключается в том, что для представления требуется @feature.title, что приводит к ошибке:

undefined method 'title' for #<Enumerator:0x0000010216efd8>

Конечно, я могу обойти проблему, заменив вышеприведенное на это, где я просто дважды определяю ограничения:

@features = Feature.find(:all, :conditions => ['featured_at < ?', Time.current], :order => 'featured_at ASC')
@feature = Feature.find(params[:feature], :conditions => ['featured_at < ?', Time.current], :order => 'featured_at ASC')

Но это кажется не элегантным и немного избыточным.

Какое лучшее решение? Как я могу обработать мой результат @features.find как Feature, а не Enumerator, в котором отсутствуют переменные / методы, которые мне нужны для доступа в представлении?

Спасибо за любые мысли по этому поводу.

1 Ответ

1 голос
/ 18 июня 2011

Я бы предложил это:

@features = Feature.where('featured_at < ?', Time.now).order('featured_at ASC')
@feature = @features.find(feature_id)

где feature_id - это идентификатор (или список идентификаторов), который вы хотите извлечь из набора. Только вторая строка попадет в базу данных. Проблема в том, что опция :all заставляет метод отправлять запрос и возвращать массив.

...