Рельсы.где и как найти


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

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

3 71

3 ответа:

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

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

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

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

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

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

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

источник

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