В чем разница между find
, where
и find_by_id
? Все они работают, когда вы пытаетесь найти пользователя с идентификатором.
Какая разница между find, where и find_by_id?
Ответ 1
Разница в том, что они возвращают, когда запись найдена, или когда она не найдена. Рассмотрим следующие примеры:
>> User.create name: 'THE USER' # creates a user with id = 1
>> User.find(1) # returns the user
>> User.find_by_id(1) # returns the user
>> User.where(id: 1).first # returns the user
Как вы можете видеть, существующий пользователь может быть извлечен с использованием любого из трех методов. Большая разница с использованием where
заключается в том, что вы можете цепью команд (конечно, сначала не вызывая first
.)
Посмотрим, когда вы попытаетесь найти запись, которая не существует
>> User.find(2) # raises an exception
>> User.find_by_id(2) # nil
>> User.where(id: 2).first # nil
Итак, очевидно, что при использовании find
для поиска записи, которая не существует, вы получаете исключение. Это исключение составляет ActiveRecord::RecordNotFound
, который отображает 404 в рабочей среде.
Надеюсь, это поможет!
UPDATE
Rails 4 использует следующий синтаксис для find_by
>> User.find_by(id: 1) # returns nil if there no user with an id of 1
>> User.find_by!(id: 1) # raises ActiveRecord::RecordNotFound when no record is found
Ответ 2
find = > Эта возвратная одиночная запись, если указанная primary_key (id) существует в системе, в противном случае она даст ошибку.
Model.find(required_id_value)
find_by = > Это приведет к возврату отдельной записи, зависит от данного атрибута, и если значение атрибута не существует в БД, оно вернет нуль.
Model.find_by_name("your name")
name здесь является атрибутом, и он должен существовать в вашем Modal.
, где = > Это приведет к возврату отношения активной записи с нулевыми или более записями, которые нужно использовать сначала, чтобы вернуть только одну запись или нуль в случае возврата нулевых записей.
Model.where(id: id_value).first
Ответ 3
find
= > используется для поиска строки id
. Это вернет одну запись.
YourModel.find(2)
Address.find(1)
find_by
= > Это используется для получения строки по любым атрибутам записи. Это приведет к возврату первой записи соответствия, если условие соответствует.
YourModel.find_by_attrname("value")
Address.find_by_street_name_and_city("Andheri", "Newyork")
Addess.find_by_id(4)
where
= > используется для получения активных записей на основе условий для возврата активного отношения записи (то есть) может быть ноль или более записей.
YourModel.where(:attrname => "something")
Address.where(:city => "Newyork")
Ответ 4
Просто для меня....
В результате "Find" возвращает вам один объект, а "Where" возвращает Array, поэтому вам нужно добавить .each для извлечения каждого объекта из этого массива.