この記事は
ファーストサーバのAdvent Calender
の12/6担当記事です。
はじめに
データベースからデータを検索する
便利なメソッドがたくさんあります!
その中でも、普段よく使っているものをまとめました。
Version
Ruby 2.1.5
Rails 4.2.3
使い方
rails console
またはrails c
で
データベースの内容を見てみよう
↓のようなテーブルがあるとします
User
id: integer
name: string
created_at: datetime
updated_at: datetime
検索あれこれ
all
その名の通りモデルの中身全てを取得します。
# Userテーブルの全てのレコードを取得
User.all
=> SELECT `users`.* FROM `users`
find
主キーで検索します。
# Userテーブルのid=1のレコードを取得
User.find(1)
=> SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
複数も可能
# Userテーブルのid=1,id=2,id=3のレコードを取得
User.find([1,2,3])
=> SELECT `users`.* FROM `users` WHERE `users`.`id` IN (1, 2, 3)
find_by
条件に合ったレコードを取得します。
※ 条件に合ったレコードの中から1件しかデータを取得しません。注意です!
- id 指定
# Userテーブルのid=1のレコードを取得
User.find_by(id: 1)
=> SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
- name 指定
# Userテーブルのname="hoge"のレコードを取得
User.find_by(name: "hoge")
=> SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hoge' LIMIT 1
where
条件にあったレコード全てを取得します。
# Userテーブルのname="hoge"のレコードを取得
User.where(name: "hoge")
=> SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hoge'
- AND検索
# Userテーブルのname="hoge"、かつid=1のレコードを取得
User.where(name: "hoge").where(id: 1)
=> SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hoge' AND `users`.`id` = 1
- OR検索
# Userテーブルのid=1またはid=2のレコードを取得
id1 = 1
id2 = 2
User.where("id IN (?) OR id IN (?) " , id1, id2)
=> SELECT `users`.* FROM `users` WHERE (id IN (1) OR id IN (2));
OR検索はもっといい書き方がありそう...
count
レコード数を返します。
# Userテーブルのname="hoge"のレコード数を取得
User.where(name: "hoge").count
=> SELECT COUNT(*) FROM `users` WHERE `users`.`name` = 'hoge'
order
並び順を指定します。
# Userテーブルの並び順をid順にする
User.order(:id)
=> SELECT `users`.* FROM `users` ORDER BY `users`.`id` ASC
- 昇順
# Userテーブルのcreate_atの昇順
User.where(name: "hoge").order(create_at: :asc)
=> SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hoge' ORDER BY `users`.`create_at ` ASC
- 降順
# Userテーブルのcreate_atの降順
User.where(name: "hoge").order(create_at: :desc)
=> SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hoge' ORDER BY `users`.`create_at ` DESC