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?

More than 3 years have 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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?