hiyoko-programingの日記

プログラミングを勉強したてのひよっ子。   エンジニア目指して勉強中。

Rails Drill 問題7

必要となる知識

特定の条件を満たすインスタンス(レコード)を全て取得する場合はwhereメソッドを使う。find_byメソッドと同様に引数でカラムと値を指定することで、その指定に一致するレコードを全て取得する。なお、返り値は条件を満たすインスタンスにより構成された配列のような形となっていて、eachメソッド等が使える。

 tweetsテーブルに保存されているuser_idが1のレコード全て取得する。

実行例

コンソール
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
pry(main)> #tweetsテーブルで、user_idが1のインスタンスを全て取得するコマンドを打ってください。
  Tweet Load (0.3ms)  SELECT `tweets`.* FROM `tweets` WHERE `tweets`.`user_id` = 1
=> [#<Tweet:0x00007fa99b943c60
  id: 1,
  text: "text",
  image: "image",
  created_at: Thu, 29 Nov 2018 07:47:54 UTC +00:00,
  updated_at: Thu, 29 Nov 2018 07:47:54 UTC +00:00,
  user_id: 1>,
 #<Tweet:0x00007fa99b9438c8
  id: 2,
  text: "I'm doing rails now. It's so fun!!",
  image: "http:://image.jpg",
  created_at: Fri, 30 Nov 2018 06:09:32 UTC +00:00,
  updated_at: Fri, 30 Nov 2018 06:09:32 UTC +00:00,
  user_id: 1>]
解答例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
pry(main)> Tweet.where(user_id: 1)
  Tweet Load (0.3ms)  SELECT `tweets`.* FROM `tweets` WHERE `tweets`.`user_id` = 1
=> [#<Tweet:0x00007fa99b943c60
  id: 1,
  text: "text",
  image: "url",
  created_at: Thu, 29 Nov 2018 07:47:54 UTC +00:00,
  updated_at: Thu, 29 Nov 2018 07:47:54 UTC +00:00,
  user_id: 1>,
 #<Tweet:0x00007fa99b9438c8
  id: 2,
  text: "I'm doing rails now. It's so fun!!",
  image: "http:://image.jpg",
  created_at: Fri, 30 Nov 2018 06:09:32 UTC +00:00,
  updated_at: Fri, 30 Nov 2018 06:09:32 UTC +00:00,
  user_id: 1>]

解説

whereメソッドはモデル名.where(カラム名: 値)で検索して、ヒットした全てのレコードを取得できる。

find_byメソッドと似ているが、find_byメソッドは条件で検索した時に、一番初めにヒットしたレコードを1つだけ取得する。
それに対し、whereメソッドは条件で検索し、ヒットした全てのレコードを取得する。