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メソッドは条件で検索し、ヒットした全てのレコードを取得する。