LoginSignup
0
0

More than 1 year has passed since last update.

where、find、find_byはどう違う?

Last updated at Posted at 2021-06-09

曖昧な理解を正せるようにまとめてみました。
この記事は基礎中の基礎なので、詳細はこちらの記事が分かりやすかったです!
【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でした。
普通に空の配列だと思ってた...要勉強!

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