ActiveRecordクエリメソッドまとめ

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

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

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

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

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

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

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

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

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

https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227

https://zenn.dev/akhmgc/articles/037777478e8d1b#where