#はじめに
ご覧頂きありがとうございます。
初学者が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