0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

find / find_by / where / find_or_create_by 各メソッドの違い

Last updated at Posted at 2024-05-07

find、find_byとfind_by!、where、find_or_create_byとfind_or_create_by!など
たくさん出てきてややこしかったためまとめました。

findメソッド

説明
・主キー(id)を指定しデータベースから1件のレコードを取得
・存在しない場合エラーを返す
・複数のデータ取得が可能

使い方
モデル.find(主キー)

Book.find(1)
Book.find(params[:id])

find_byメソッド

説明
・条件を指定しデータベースから最初に見つかった1件のレコードを取得
・存在しない場合はnillを返す
・主キー以外のカラム検索も可能(カラムを指定しないとエラーになる)
・複数のデータ取得不可

使い方
モデル.find_by(任意のカラム名: 格納されている値)
失敗したら例外発生
モデル.find_by!(任意のカラム名: 格納されている値)

Book.find_by(title: "ruby")
Book.find_by(title: "ruby", body: "rails")

whereメソッド

whereメソッドはどのカラムでも検索でき、複数データ取得できる良いとこどり!

説明
・条件を指定しデータベースからレコードを取得
・存在しない場合はnillを返す
・主キー以外のカラム検索も可能(カラムを指定しないとエラーになる)
・複数のデータ取得可能

使い方
モデル名.where(任意のカラム名: 格納されている値)

Book.where(title: "ruby")
Book.where(body: "rails")
Book.where(title: "ruby", body: "rails")

find_or_create_byメソッド

説明
条件を指定しデータベースから最初に見つかった1件のレコーを取得、1件もなければ作成

使い方
モデル.fine_or_create_by(任意のカラム名: ブロック引数)
失敗したら例外発生
モデル.find_or_create_by!(任意のカラム名: ブロック引数)

User.find_or_create_by(first_name: "Taraou")

find_byとfind_by!の違い

説明
・条件に一致するレコードが見つからなかった場合

find_by → nillを返す(エラーにならない)
find_by! → エラーを返す

find_or_create_byとfind_or_create_by!の違い

説明
・なんらかの原因で処理に失敗した場合エラーを返す。


条件に一致するレコードが見つからず、新しいレコードを作成しようとした時に
バリデーションエラーなどになった場合

find_or_create_by → nillを返す(エラーにならない)
find_or_create_by! → エラーを返す

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?