LoginSignup
236
231

More than 5 years have passed since last update.

Railsのモデル検索あれこれ

Posted at

この記事は
ファーストサーバの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
236
231
1

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
236
231