はじめに
Railsで開発をするとき、RDBへのデータ操作はActiveRecordを介して実施する。DBデータの変更がオブジェクトの変更に抽象化されるため、SQLを知らなくてもデータベースへのデータの書き込み、取り出し、上書き、削除といった操作ができることができるのだけど、SQLをある程度知っている人には辛かったりする。(このSQLを書くためには、 ActiveRecordでどう書けばいいんだ?的な)なので、ここの記事にまとめておく。
前提
扱うモデルは下のようなテーブルとする。
usersテーブル
mysql> desc users;
+-----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| organization_id | int(11) | YES | | NULL | |
| name | varchar(255) | NO | | NULL | |
| address | varchar(255) | NO | | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
| retired | tinyint(1) | NO | | 0 | |
+-----------------+--------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)
確認方法
User::ActiveRecord_Relationクラスのインスタンスメソッド(to_sql)
で確認できる。
例)
pry>User.all.to_sql
=> "SELECT `users`.* FROM `users`"
CRUD系操作
SELECT
1テーブルの検索
|目的 |SQL |ActiveRecord |
|---|---|---|---|
|全件取得
(すべてのカラム) |select * from users; |User.all |
|全件取得
(カラム指定) |select id, name from users; |User.all.select('id,name')
User.all.select([:id,:name]) |
|ソート
(昇順)|select * from users order by name;|User.all.order(:name)|
|ソート
(降順)|select * from users order by name desc;|User.all.order("name desc")|
|条件指定
(=)|select * from users where id = 2;|User.all.where(id: 2)|
|条件指定
(<, >)|select * from users where id > 5;|User.all.where('id > 5')|
|条件指定
(IN句)|select * from users where id in (2,3,4);|User.all.where(id: [2,3,4])|
|条件指定
(like句)|select * from users where address like a%';|User.all.where("address like 'a%'")|
|件数カウント(count)|select count(*) from users|User.all.count|
|重複排除(distinct)|select distinct name from users |User.all.uniq(:name)|
複数テーブルのJOIN,検索
WIP
INSERT
WIP
UPDATE
WIP
DELETE
WIP
ヒント句
サニタイズ
WIP
bind変数
WIP