【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