Как я могу заставить named_scope в направляющих возвратить одно значение вместо массива?

Я хочу записать именованный объем для получения записи от ее идентификатора.

Например, мне назвали модель Event, и я хочу моделировать Event.find(id) с использованием named_scope для будущей гибкости.

Я использовал этот код в своей модели:

named_scope :from_id, lambda { |id| {:conditions => ['id= ?', id] } }

и я называю его от своего контроллера как Event.from_id(id). Но моя проблема состоит в том, что это возвращает массив Event объекты вместо всего одного объекта.

Таким образом, если я хочу получить имя события, должен записать я

event = Event.from_id(id)
event[0].name

в то время как то, что я хочу,

event = Event.from_id(id)
event.name

Я делаю что-то не так здесь?

17
задан P Shved 29 May 2010 в 07:56
поделиться

2 ответа

Как упоминает Дэмиен, использование настраиваемой области только для поиска по идентификатору не рекомендуется. Но чтобы ответить на ваш вопрос:

Поиск записей с помощью named_scope всегда будет возвращать объект ActiveRecord :: NamedScope :: Scope , который ведет себя как массив. Если ваш запрос возвращает только одну запись, вы можете использовать метод first , чтобы напрямую получить объект ActiveRecord, например:

event = Event.from_id(id).first
event.name # will work as you expect
10
ответ дан 30 November 2019 в 12:57
поделиться

Здесь нет необходимости использовать прицел. Вы можете просто сделать Event.find_by_id id .
Разница между find и find_by_id заключается в том, что первый вызовет исключение ActiveRecordNotFoundException , если запись не существует. Второй просто вернет ноль.

Написание области видимости для получения записи по ее идентификатору - очень плохой идентификатор, поскольку он уже изначально предоставляется rails.

5
ответ дан 30 November 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: