🧐

【Rails】find / find_by / whereメソッド

2023/06/30に公開

データの取得方法に使われる、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 テーブルにデータが格納されているとします。

  1. 特定の主キーのみを取得したい場合:
List.find(1)

上記の例では、id が 1 のレコードを取得しています。

  1. URLの:idを取得したい場合:
List.find(params[:id])

上記の例では、URL の :id パラメータから主キーを取得しています。

注意点:
find メソッドは主キーを使用して1つレコードを取得する場合に便利ですが、該当するレコードが見つからない場合にはエラーが発生します。そのため、レコードの存在を確認してから find メソッドを使用する必要があります。

find_byメソッド

find_by メソッドは、指定したカラムの値に基づいて1つのレコードを取得するために使用します。主キー以外のカラムを検索条件に指定できるのが特徴です。

特徴:

  • find_by メソッドは、指定したカラムの値に基づいてレコードを取得します。
  • 主キー以外のカラムを検索条件に指定できます。
  • 複数のレコードが一致する場合でも、最初に見つかった1件のみを返します。
  • 該当するデータが見つからない場合には nil を返します。

記述の仕方:

  • モデル名の後に find_by メソッドを呼び出し、検索条件をハッシュ形式で指定します。
  • ハッシュのキーには検索対象のカラム名、値には検索したい値を指定します。

例:
前提条件:List テーブルにデータが格納されているとします。

  1. 特定のカラム(ここでは title)の値が "ruby" と一致するレコードを取得する場合:
List.find_by(title: "ruby")

上記の例では、title カラムの値が "ruby" に一致する最初のレコードを取得しています。

  1. 複数のカラムを指定して検索する場合:
List.find_by(title: "ruby", body: "rails")

上記の例では、title カラムの値が "ruby" かつ body カラムの値が "rails" に一致する最初のレコードを取得しています。

注意点:
find_by メソッドは、最初に一致したレコードのみを返します。複数のレコードが一致する場合、順序は保証されません。

whereメソッド

where メソッドは、指定した条件に一致する複数のレコードを取得するために使用されます。主キー以外のカラムを検索条件に指定できる点が特徴です。

特徴:

  • where メソッドは、指定した条件に一致する複数のレコードを取得します。
  • 主キー以外のカラムを検索条件に指定できます。
  • 該当するデータがない場合、空の配列が返されます。

記述の仕方:

  • モデル名の後に where メソッドを呼び出し、検索条件をハッシュ形式で指定します。
  • ハッシュのキーには検索対象のカラム名、値には検索したい値を指定します。

例:
前提条件:List テーブルにデータが格納されているとします。

  1. 特定のカラム(ここでは title)の値が "ruby" に一致する全てのレコードを取得する場合:
List.where(title: "ruby")

上記の例では、title カラムの値が "ruby" に一致する全てのレコードを取得しています。

  1. 複数のカラムを指定して検索する場合:
List.where(title: "ruby", body: "rails")

上記の例では、title カラムの値が "ruby" かつ body カラムの値が "rails" に一致する全てのレコードを取得しています。

注意点:
where メソッドは、条件に一致する複数のレコードを返します。返される結果は、配列として取得されます。


以上、find, find_by, whereメソッドの解説でした!

Discussion