😊

find, find_by, where

に公開

findメソッドとは

大まかに特徴として以下の3つがあげられます。
1.find()の()内に記述できる数値(id)のみ
2.idは主キーなので、1レコードのみ取得
3.検索に該当するデータがなかった場合、ActiveRecord::RecordNotFoundを返す
記述の仕方としては

モデル名.find(主キー)

①id=1のみを取得したい場合

List.find(1)

②URLの:idを取得したい場合、

List.find(params[:id])

find_byメソッドとは

主なイメージは、「主キー(id)以外のカラムを指定しても、見つかった1レコードを返せる」です。特徴としては
1.find_by()の()内に記述できるのは、数値(id)だけでなく、文字(id以外のカラム)も可能
2.id以外のカラムも指定できるので、複数のレコードが見つかる場合もありますが、その時は、一番最初に見つかったレコード1件を取得
3.検索に該当するデータがなかった場合、nilを返す
記述の仕方としては

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

例)
前提条件:sample_appのListテーブルに格納されているデータを取得したい場合

①titleカラムに「ruby」で投稿されたレコードを取得したい場合

List.find_by(title: "ruby")

②bodyカラムに「rails」で投稿されたレコードを取得したい場合

List.find_by(body: "rails")

③titleカラムに「ruby」、bodyカラムに「rails」で投稿されたレコードを取得したい場合

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

whereメソッドとは

主なイメージは、「主キー(id)以外のカラムも指定できる、且つ、複数のレコードも返せる」です。特徴として
1.where()の()内に記述できるのは、数値(id)だけでなく、文字(id以外のカラム)も可能
2.該当する複数のレコードを取得
3.検索に該当するデータがなかった場合、空の配列を返す
があります。
記述の仕方として

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

例)
前提条件:sample_appのListテーブルに格納されているデータを取得したい場合

①titleカラムに「ruby」で投稿された全レコードを取得したい場合

List.where(title: "ruby")

②bodyカラムに「rails」で投稿された全レコードを取得したい場合

List.where(body: "rails")

③titleカラムに「ruby」、bodyカラムに「rails」で投稿された全レコードを取得したい場合

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

他にもwhereは条件を加えてレコードを取得することができます。

NOT条件

#titleが「test」以外のレコードを全て取得
Book.where.not(title: "test")

AND条件

#titleが「test」で、なおかつpriceが「960」のレコードを全て取得
#Book.where(title: "test", price: 960)でも可
Book.where(title: "test").where(price: 960)

OR条件

#titleが「hoge」かpriceが「800」のレコードを全て取得
Book.where(title: "hoge").or(Book.where(price: 800))

A and B or C

#titleが「hoge」かつpublishが「fuga」のレコードまたは、priceが960のレコードを取得
Book.where(title: "hoge").where(publish: "fuga").or(Book.where(price: 960))

参考にさせていただいた記事

https://qiita.com/nakayuu07/items/3d5e2f8784b6f18186f2

まとめ

欲しいidの値が分かっていて、そのidのデータを取得したい場合・・・find
idの値が不明で、id以外のカラムを検索条件としたい場合・・・find_by
id以外のカラムの検索条件で、複数の実行結果を取得したい場合・・・where
今日はレイアウト中心だったので復習で使用頻度の高いメソッドの復習をしました!!

Discussion