はじめに
find
とfind_by
は、Railsでデータベースからレコードを取得するためのメソッドですが、いくつかの違いがあります。
findとfind_byの違いについて理解が曖昧だったため備忘録も兼ねてまとめます。
検索条件の指定方法
find
: 主キー(通常はid)を指定してレコードを取得します。例えば、User.find(1)
はid
が1であるユーザーを取得します。
find_by
: 様々な条件を指定して検索できます。例えば、User.find_by(name: 'John')
はname
がJohnであるユーザーを取得します。
# 主キーを指定して取得
user = User.find(1)
# 条件を指定して取得
user_by_name = User.find_by(name: 'John')
エラーハンドリング
find
: 主キーが見つからなかった場合、ActiveRecord::RecordNotFound
例外が発生します。主キーが存在しない場合、エラーが発生するため注意が必要です。
find_by
: 該当するレコードが見つからなかった場合、nil
を返します。そのためエラーが発生することはありません。
# 主キーが見つからない場合の例外処理
begin
user = User.find(100)
rescue ActiveRecord::RecordNotFound
puts "User not found!"
end
# find_byではnilを返すため、エラーハンドリングが不要
user_by_name = User.find_by(name: 'Nonexistent')
puts user_by_name.nil? # true
取得されるオブジェクトの型
find
: 単一の主キーに対応するレコードが見つかれば、単一のレコードを返します。
find_by
: 条件に合致する最初のレコードを返します。該当するレコードがなければnil
を返します。
# 単一の主キーに対応するレコードを取得
user = User.find(1)
# 最初の条件に合致するレコードを取得
user_by_name = User.find_by(name: 'John')
まとめ
どちらを使用するかは、具体的な使用ケースやエラーハンドリングの方針によります。通常、主キーを使用して特定のレコードを取得する場合はfind
、特定の条件で検索する場合はfind_by
を使用します。