47

findwhereとの違いは何find_by_idですか?IDが与えられたユーザーを見つけようとすると、これらはすべて機能します。

4

5 に答える 5

68

違いは、レコードが見つかったとき、または見つからなかったときに返されるものです。次の例を検討してください。

>> 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
于 2013-03-03T13:02:44.423 に答える
5

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
于 2016-10-04T09:16:56.343 に答える
1

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")
于 2013-03-03T13:03:37.147 に答える
0

私には簡単です...

'Find'は結果として単一のオブジェクトを返しますが、'Where'はArrayを返すため、その配列から各オブジェクトをフェッチするには.eachを追加する必要があります。

于 2019-01-28T10:02:33.507 に答える
0

大したことではありませんが、1つ以上のレコードを取得しようとしたときに、各レコードを更新する必要があり、を使用する場合は、クエリの結果がであるため、メソッドを処理するという別の違いがfindあります。しかし、検索結果を使用しようとすると、エラーが発生します。wherefind_eachwherewhereActiveRecord::Relationfind_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
于 2022-02-07T21:23:37.633 に答える