RDBMSのVIEWを使ってRailsのデータアクセスをいい感じにする【銀座Rails#10】

morimorihogeです。しばらくぶりですが、この度銀座Rails#10 @リンクアンドモチベーションにて発表させていただきましたので、その内容をまとめたいと思います。 ※当日は時間が足りなくて端折ってしまう部分もあるかと思うので、その補遺としての意味合いもあります 注1:本記事では分かりやすさのためにTABLEやVIEWなどのSQL予約語は大文字で記載していきます。 注2:Rails 5.2.3、PostgreSQL 11環境で検証しています おさらい:VIEWについて 本記事におけるVIEWはRDBMSにおけるVIEWの話で、ActionViewではありません。 VIEWについて使ったことがない人もいるかなと思うので、最初に軽く解説します。 VIEWは一言で言ってしまえばSELECT文の実行結果に名前を付けて、TABLEと同じようにアクセスできるものです。 例えば、以下のようなproductsテーブルとデータがあったとします。 CREATE TABLE products ( id SERIAL NOT NULL PRIMARY KEY, name VARCHAR(255) NOT NULL, price INTEGER NOT NULL, purchase_price INTEGER NOT NULL ); INSERT INTO products(name, price, purchase_price) VALUES (‘安いビール’, 150, 140), (‘普通のビール’, 200, 180), (‘お高いビール’, 1500, 1300); このproductsテーブルに対して、idカラムを除いたデータを参照するview_productsを作るにはCREATE VIEW [view_name] AS [query]構文を使います。 CREATE VIEW view_products AS SELECT name, price FROM products; こうして作られたVIEWは、通常のTABLEと同じようにSELECTすることができます。 view_demo_development=# select * from products; id | name | price | purchase_price —-+————–+——-+—————- 1 | 安いビール | 150 | 140 2 | 普通のビール | 200 | 180 3 | お高いビール | 1500 | 1300 (3 rows) view_demo_development=# select * from view_products; name | price ————–+——- 安いビール | 150 普通のビール | 200 お高いビール | 1500 (3 rows) VIEWの機能は基本的にはこれだけです。シンプルですね。 また、VIEWはSQL標準機能としてSQL89から存在しており、一般的なRDBMSであれば使えます。 PostgreSQLであれば\dでTABLEやSEQUENCEと一緒に一覧できます。 view_demo_development=# \d List of relations Schema | Name | Type | Owner ——–+———————-+———-+———- public | products | table | postgres public | products_id_seq | sequence | postgres public | view_products | view | postgres (3 rows) RailsのActiveRecordとVIEW RalisのORM(Object-Relational Mapper)であるActiveRecordでは、実は接続しているDBに既に作られたVIEWであれば何も考えずに参照することができます。 $ bundle exec rails console Running via Spring preloader in process 23674 Loading development environment (Rails 5.2.3) … Continue reading RDBMSのVIEWを使ってRailsのデータアクセスをいい感じにする【銀座Rails#10】