ActiveRecordの使い方


はじめに

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