find
、where
との違いは何find_by_id
ですか?IDが与えられたユーザーを見つけようとすると、これらはすべて機能します。
5 に答える
違いは、レコードが見つかったとき、または見つからなかったときに返されるものです。次の例を検討してください。
>> 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
ご覧のとおり、既存のユーザーは3つの方法のいずれかを使用してフェッチできます。を使用する場合の大きな違いは、where
コマンドをチェーンできることです(もちろん、first
最初に呼び出す必要はありません)。
存在しないレコードを見つけようとするときを見てみましょう
>> User.find(2) # raises an exception
>> User.find_by_id(2) # nil
>> User.where(id: 2).first # nil
したがって、ここでfind
は、存在しないレコードを検索するために使用すると、例外が発生することは明らかです。その例外はActiveRecord::RecordNotFound
、実稼働環境で404をレンダリングするものです。
お役に立てれば!
アップデート
Rails 4は、次の構文を使用します。find_by
>> User.find_by(id: 1) # returns nil if there's no user with an id of 1
>> User.find_by!(id: 1) # raises ActiveRecord::RecordNotFound when no record is found
find =>指定されたprimary_key(id)がシステムに存在する場合、これは単一のレコードを返します。存在しない場合、エラーが発生します。
Model.find(required_id_value)
find_by =>これは、指定された属性に応じて単一のレコードを返します。属性の値がDBに存在しない場合は、nilを返します。
Model.find_by_name("your name")
ここでの名前は属性であり、モーダルに存在する必要があります。
ここで=>これは、ゼロ個以上のレコードを持つアクティブなレコード関係を返します。最初に使用して1つのレコードのみを返すか、ゼロレコードが返される場合はnilを返す必要があります。
Model.where(id: id_value).first
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
=>これは、アクティブレコードの関係を返すための条件に基づいてアクティブレコードを取得するために使用されます(つまり、0個以上のレコードである可能性があります)。
YourModel.where(:attrname => "something")
Address.where(:city => "Newyork")
私には簡単です...
'Find'は結果として単一のオブジェクトを返しますが、'Where'はArrayを返すため、その配列から各オブジェクトをフェッチするには.eachを追加する必要があります。
大したことではありませんが、1つ以上のレコードを取得しようとしたときに、各レコードを更新する必要があり、を使用する場合は、クエリの結果がであるため、メソッドを処理するという別の違いがfind
あります。しかし、検索結果を使用しようとすると、エラーが発生します。where
find_each
where
where
ActiveRecord::Relation
find_each
Profile.find([1, 2, 3]).find_each { |e| puts e.id }
=> NoMethodError (undefined method `find_each' for
<Array:0x0000555e923d3f38>)
Profile.where(id: [1, 2, 3]).find_each { |e| puts e.id }
=> 1
=> 2
=> 3