Как я могу заставить named_scope в Rails возвращать одно значение вместо массива? - PullRequest
16 голосов
/ 29 мая 2010

Я хочу написать с именем 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

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

Ответы [ 3 ]

12 голосов
/ 09 марта 2012

В этом случае я бы создал метод класса

def self.from_id(id)
  self.find(id).first
end

Другой пример:

class Invoice
  def self.number
    self.find(:first, 
      :select => "max(number) As last, max(number)+1 As next", 
      :conditions => "type = 'SalesOrder'")
  end
end

Такие методы лучше, чем named_scope. Вы можете позвонить Invoice.number.next, лучше named_scope вернуть Invoice.number[0].next.

10 голосов
/ 29 мая 2010

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

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

event = Event.from_id(id).first
event.name # will work as you expect
5 голосов
/ 29 мая 2010

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

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

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