Railsのモデル検索あれこれ

More than 3 years have passed since last update.

この記事は

ファーストサーバの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