はじめに
find と find_by は、どちらもRailsでレコードを取得するためのメソッドで似ていますが、少々動作や使い方に違いがあります。
それぞれ解説していきます!
find
概要
プライマリキー(通常は id カラム)を指定して、1つのレコードを取得します。
エラーハンドリング
指定した id に該当するレコードが見つからない場合は、ActiveRecord::RecordNotFound 例外が発生します。
使い方
user = User.find(1)
User.find(1) は、 id が 1 のユーザーを取得します。
idが1のユーザーが存在しない場合、ActiveRecord::RecordNotFound例外エラーが発生します。
find_by
概要
任意のカラムに基づいて条件を指定し、最初に一致するレコードを取得します。
エラーハンドリング
指定した条件に一致するレコードが見つからない場合は、nil を返します(例外は発生しません)。
使い方
user = User.find_by(name: "Alice")
User.find_by(name: "Alice") は、name が "Alice" の最初のユーザーを取得します。
一致するユーザーが存在しない場合、userはnilになります。
違いのまとめ
find
使用目的: 主キーで1件のレコードを取得
レコードが見つからない場合: ActiveRecord::RecordNotFound の例外発生
戻り値: 1件のレコード
使い分け: 必ず存在する id を使ってレコードを取得したいときに便利です。レコードが存在しないとエラーが発生するため、エラーハンドリングも明確に行いたい場合に適しています。
find_by
使用目的: 任意のカラムに基づいてレコードを取得
レコードが見つからない場合: nil を返す
戻り値: 最初に一致した1件のレコード
使い分け: 特定の条件に合致する最初のレコードを取得したいときや、レコードが存在しない場合に nil が返されても問題ない場合に便利です。