Я хочу записать именованный объем для получения записи от ее идентификатора.
Например, мне назвали модель 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
Я делаю что-то не так здесь?
Как упоминает Дэмиен, использование настраиваемой области только для поиска по идентификатору не рекомендуется. Но чтобы ответить на ваш вопрос:
Поиск записей с помощью named_scope
всегда будет возвращать объект ActiveRecord :: NamedScope :: Scope
, который ведет себя как массив. Если ваш запрос возвращает только одну запись, вы можете использовать метод first
, чтобы напрямую получить объект ActiveRecord, например:
event = Event.from_id(id).first
event.name # will work as you expect
Здесь нет необходимости использовать прицел. Вы можете просто сделать Event.find_by_id id
.
Разница между find
и find_by_id
заключается в том, что первый вызовет исключение ActiveRecordNotFoundException
, если запись не существует. Второй просто вернет ноль.
Написание области видимости для получения записи по ее идентификатору - очень плохой идентификатор, поскольку он уже изначально предоставляется rails.