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! → エラーを返す