【Rails】find / find_by / whereメソッド
データの取得方法に使われる、find
, find_by
, where
の3つのメソッドについてまとめます。
それぞれの特徴は簡単にまとめると以下の通りです。
メソッド | 特徴 | 使用例 |
---|---|---|
find | 主キーで1レコードを検索し、見つかったレコードを返す | User.find(1) |
find_by | 条件に一致する1レコードを返す | User.find_by(name: 'Ganmo') |
where | 条件に一致する複数のレコードを返す | User.where(age: 20) |
順番に解説していきます。
findメソッド
find
メソッドは、主キー(id)を指定して、データベースから1つのレコードを取得するために使用します。
特徴:
-
find
メソッドは主キー(idカラム)を使ってレコードを取得します。 - 主キーを指定することで、該当するレコードが見つかればそれを返します。
- 該当するレコードが見つからない場合には、
ActiveRecord::RecordNotFound
エラーが発生します。
記述の仕方:
- モデル名の後に
find
メソッドを呼び出し、主キーを引数として渡します。 - 主キーは数値のみ使用できます。
例:
前提条件:List
テーブルにデータが格納されているとします。
- 特定の主キーのみを取得したい場合:
List.find(1)
上記の例では、id
が 1 のレコードを取得しています。
- URLの:idを取得したい場合:
List.find(params[:id])
上記の例では、URL の :id
パラメータから主キーを取得しています。
注意点:
find
メソッドは主キーを使用して1つレコードを取得する場合に便利ですが、該当するレコードが見つからない場合にはエラーが発生します。そのため、レコードの存在を確認してから find
メソッドを使用する必要があります。
find_byメソッド
find_by
メソッドは、指定したカラムの値に基づいて1つのレコードを取得するために使用します。主キー以外のカラムを検索条件に指定できるのが特徴です。
特徴:
-
find_by
メソッドは、指定したカラムの値に基づいてレコードを取得します。 - 主キー以外のカラムを検索条件に指定できます。
- 複数のレコードが一致する場合でも、最初に見つかった1件のみを返します。
- 該当するデータが見つからない場合には
nil
を返します。
記述の仕方:
- モデル名の後に
find_by
メソッドを呼び出し、検索条件をハッシュ形式で指定します。 - ハッシュのキーには検索対象のカラム名、値には検索したい値を指定します。
例:
前提条件:List
テーブルにデータが格納されているとします。
- 特定のカラム(ここでは
title
)の値が "ruby" と一致するレコードを取得する場合:
List.find_by(title: "ruby")
上記の例では、title
カラムの値が "ruby" に一致する最初のレコードを取得しています。
- 複数のカラムを指定して検索する場合:
List.find_by(title: "ruby", body: "rails")
上記の例では、title
カラムの値が "ruby" かつ body
カラムの値が "rails" に一致する最初のレコードを取得しています。
注意点:
find_by
メソッドは、最初に一致したレコードのみを返します。複数のレコードが一致する場合、順序は保証されません。
whereメソッド
where
メソッドは、指定した条件に一致する複数のレコードを取得するために使用されます。主キー以外のカラムを検索条件に指定できる点が特徴です。
特徴:
-
where
メソッドは、指定した条件に一致する複数のレコードを取得します。 - 主キー以外のカラムを検索条件に指定できます。
- 該当するデータがない場合、空の配列が返されます。
記述の仕方:
- モデル名の後に
where
メソッドを呼び出し、検索条件をハッシュ形式で指定します。 - ハッシュのキーには検索対象のカラム名、値には検索したい値を指定します。
例:
前提条件:List
テーブルにデータが格納されているとします。
- 特定のカラム(ここでは
title
)の値が "ruby" に一致する全てのレコードを取得する場合:
List.where(title: "ruby")
上記の例では、title
カラムの値が "ruby" に一致する全てのレコードを取得しています。
- 複数のカラムを指定して検索する場合:
List.where(title: "ruby", body: "rails")
上記の例では、title
カラムの値が "ruby" かつ body
カラムの値が "rails" に一致する全てのレコードを取得しています。
注意点:
where
メソッドは、条件に一致する複数のレコードを返します。返される結果は、配列として取得されます。
以上、find
, find_by
, where
メソッドの解説でした!
Discussion