1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ActiveRecordクエリメソッドまとめ

Last updated at Posted at 2021-11-23

#はじめに
ご覧頂きありがとうございます。
初学者がActiveRecordのクエリメソッドと生成されるSQLと比較しながら、まとめました。
また個々のメソッドの詳しい使い方に関してはRailsドキュメントを参照ください。

#find
idを指定してレコードを取得
見つからなかった場合は例外(ActiveRecord::RecordNotFound)が発生

User.find(1)
# SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1

#find_by
条件を指定して、レコード1件取得する
見つからなかった場合はnilを返却

User.find_by(id: 1)
# SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1

#first
idで昇順に並び替えて、最初の1件を取得

User.first
# SELECT `users`.* FROM `users` ORDER BY `users`.`id` ASC LIMIT 1

#last
idで降順に並び替えて、最初の1件を取得

User.last
# SELECT `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1

#exitsts?
条件に合うレコードの有無を確認
見つかった場合はtrue、見つからなかった場合はfalse

User.exists?(id:1)
# SELECT 1 AS one FROM `users` WHERE `users`.`id` = 1 LIMIT 1

#count
SQLのcount関数を使用してレコードの個数を取得

User.count
# SELECT COUNT(*) FROM `users`

#average
SQLのave関数を使用して平均値を取得

User.average("age")
# SELECT AVG(`users`.`age`) FROM `users`

#maximum
SQLのmax関数を使用して最大値を取得

User.maximum("age")
# SELECT MAX(`users`.`age`) FROM `users`

#minimum
SQLのmin関数を使用して最小値を取得

User.minimum("age")
# SELECT MIN(`users`.`age`) FROM `users`

#update
条件に合うレコードを更新

User.find(1).update(name: "hoge")
# UPDATE `users` SET `users`.`name` = 'hoge', `users`.`updated_at` = '2021-11-23 05:49:40.179370' WHERE `users`.`id` = 1

#delete
条件に合うレコードを削除(関連付けられたモデルは削除しない)

User.find(1).delete
# DELETE FROM `users` WHERE `users`.`id` = 1

#destroy
条件に合うレコードを削除(関連付けられたモデルも削除)

User.find(1).destroy
# DELETE FROM `users` WHERE `users`.`id` = 1

deleteとdestroyの違いは下記を参考
https://qiita.com/kamelo151515/items/0fa7fb15a1d2c1e44db2
https://www.sejuku.net/blog/63480

#where
SQLのwhere節を作る
重ねがけするとand条件として重なっていく
またfind,find_byとは違いActiveRecord_Relationクラスを返す

User.where(id: 1)
# SELECT `users`.* FROM `users` WHERE `users`.`id` = 1

User.where(id: 1).or(User.where(id: 2)) ## or条件
# SELECT `users`.* FROM `users` WHERE (`users`.`id` = 1 OR `users`.`id` = 2)

User.where(id: 1).where(name: "test") ## and条件
# SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 AND `users`.`name` = 'test'

find,find_by,whereの違いは下記の記事を参考
https://qiita.com/nakayuu07/items/3d5e2f8784b6f18186f2

#order
SQLのorder by節をつくる
データの並び替える

User.all.order(id: "DESC") ##idの降順で並び替え
# SELECT `users`.* FROM `users` ORDER BY `users`.`id` DESC

User.all.order(id: "ASC") ##idの昇順で並び替え
# SELECT `users`.* FROM `users` ORDER BY `users`.`id` ASC

#joins
join節をつくる
テーブルを結合する

User.joins(:posts)
# SELECT `users`.* FROM `users` INNER JOIN `posts` ON `posts`.`user_id` = `users`.`id`

詳しくは以下の記事を参考
https://qiita.com/yuyasat/items/c2ad37b5a24a58ee3d30

また類似メソッドであるincludes,preloadとの違いは以下を参考
https://qiita.com/k0kubun/items/80c5a5494f53bb88dc58

#group
group by節をつくる
指定されたキーで集約する

User.group(:age)
# SELECT `users`.* FROM `users` GROUP BY `users`.`age`

#limit
limit節をつくる
取得個数を指定する

User.limit(5) ##5件取得する
# SELECT `users`.* FROM `users` LIMIT 5

#destinct
select節にdistinctを追加する
重複除去する

User.distinct(:name) ##名前の重複がないようレコードを取得
# SELECT DISTINCT `users`.* FROM `users`

#all
レコードをすべて取得
whereと同じくActiveRecord_Relationクラスを返す

User.all
# SELECT `users`.* FROM `users`

#参考
https://railsguides.jp/active_record_basics.html

1
1
0

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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?