Rails.where vs .find

Я заметил, что метод Model.where всегда возвращает массив, даже если есть только один результат, когда метод Model.find не работает. Есть ли причина для этого? Я думал, что Model.where была предпочтительной функцией, так как Rails 3.X.

Должен ли я использовать Model.find, когда ожидаю один результат и Model.where, когда ожидаю более одного результата?

Ответ 1

  • where возвращает ActiveRecord::Relation (а не массив, хотя он ведет себя подобно одному), который представляет собой набор объектов модели. Если ничто не соответствует условиям, оно просто возвращает пустое отношение.

  • find (и связанные с ним динамические методы find_by_columnname) возвращает один объект модели. Если ничего не найдено, возникает исключение ActiveRecord::RecordNotFound (но не с динамическими методами find_by_).

    В то время как find может возвращать массив записей, а не ссылку - если задан список идентификаторов, использование where является предпочтительным с Rails 3. Многие аналогичные применения find теперь устарел или прошел полностью.

Так что да, если вы только хотите и ожидаете одного объекта, проще использовать find, так как иначе вы должны позвонить Model.where.first.

Обратите внимание, что параметры хеша старого стиля для find и многие динамические методы find_ устарели как Rails 4.0 (см. соответствующие примечания к выпуску).

Ответ 2

Фактически find_by получает модельный объект из where, полученный ActiveRecord::Relation

def find_by(*args)
  where(*args).take
end

Источник

Ответ 3

Model.find используется столбец первичного ключа. Поэтому всегда есть точно один или никакой результат. Используйте его, когда вы ищете один определенный элемент, идентифицированный с помощью идентификатора.