Rails .where vs .find - PullRequest
       1

Rails .where vs .find

73 голосов
/ 06 марта 2012

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

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

Ответы [ 3 ]

115 голосов
/ 06 марта 2012
  • where возвращает ActiveRecord::Relation (не массив, даже если он ведет себя очень похоже на единицу), который представляет собой коллекцию объектов модели.Если ничто не соответствует условиям, оно просто возвращает пустое отношение.

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

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

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

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

12 голосов
/ 25 января 2014

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

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

Источник

6 голосов
/ 06 марта 2012

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

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