曖昧な理解を正せるようにまとめてみました。
この記事は基礎中の基礎なので、詳細はこちらの記事が分かりやすかったです!
【Rails】find・find_by・whereについてまとめてみた
#①結論
主キー(id)のレコード(データ)を取得したい→find
id以外のカラムを検索条件としてレコードを取得したい→find_by
id以外のカラムを検索条件として、複数のレコードを取得したい場合→where
#②findメソッド
主キー(id)のレコード(データ)を取得
> Quiz.find(37)
=> #<Quiz:0x00007fb1deaf03d8
id: 37,
question: "destroy",
correct: "破壊",
incorrect1: "消去",
incorrect2: "怪獣",
answer_description: "壊す・破壊です。",
user_id: 2,
created_at: Tue, 01 Jun 2021 09:14:50 UTC +00:00,
updated_at: Tue, 01 Jun 2021 09:14:50 UTC +00:00,
category_id: 5>
条件に当てはまるデータが無ければArgumentError(例外)が投げられる
> Quiz.find(132)
ActiveRecord::RecordNotFound: Couldn't find Quiz with 'id'=132
#③find_byメソッド
主キー以外を検索条件としてレコードを取得(主キーでも可)
ただし返ってくる結果は、最初にヒットした1件のみ
> Quiz.find_by(question: "margin")
=> #<Quiz:0x00007fb1dd10eb90
id: 47,
question: "margin",
correct: "余白",
incorrect1: "マジ",
incorrect2: "白",
answer_description: "マージンは外側の余白です。paddingは?",
user_id: 1,
created_at: Thu, 03 Jun 2021 03:03:42 UTC +00:00,
updated_at: Thu, 03 Jun 2021 03:03:42 UTC +00:00,
category_id: 3>
複数の検索条件を指定可
> Quiz.find_by(category_id: 3, user_id: 1)
=> #<Quiz:0x00007fb1dd1f68f0
id: 45,
question: "background",
correct: "背景",
incorrect1: "後退",
incorrect2: "地面",
answer_description: "バックグラウンドです",
user_id: 1,
created_at: Thu, 03 Jun 2021 03:01:47 UTC +00:00,
updated_at: Thu, 03 Jun 2021 03:01:47 UTC +00:00,
category_id: 3>
条件に当てはまるデータが無ければnilが返ってくる
> Quiz.find_by(correct:"時計")
=> nil
#④whereメソッド
主キー以外を検索条件として該当するレコードを全て取得
ただし配列で返ってくる点に注意
> Quiz.where(category_id: 3)
=> [#<Quiz:0x00007fb1ab4ca630
id: 45,
question: "background",
correct: "背景",
incorrect1: "後退",
incorrect2: "地面",
answer_description: "バックグラウンドです",
user_id: 1,
created_at: Thu, 03 Jun 2021 03:01:47 UTC +00:00,
updated_at: Thu, 03 Jun 2021 03:01:47 UTC +00:00,
category_id: 3>,
#<Quiz:0x00007fb1ab4ca4a0
id: 46,
question: "border",
correct: "境目",
incorrect1: "ボード",
incorrect2: "線",
answer_description: "ボーダーの服は、境目だらけの服ですね",
user_id: 1,
created_at: Thu, 03 Jun 2021 03:02:42 UTC +00:00,
updated_at: Thu, 03 Jun 2021 03:02:42 UTC +00:00,
category_id: 3>]
条件に当てはまるデータが無ければQuiz::ActiveRecord_Relation
が返ってくる(空の配列ではない)
> Quiz.where(user_id: 15)
=> []
> Quiz.where(user_id: 15).class
=> Quiz::ActiveRecord_Relation
#⑤おわりに
Quiz::ActiveRecord_Relationについての理解が0でした。
普通に空の配列だと思ってた...要勉強!