使いそうで使わない?RailsでTemporary Tableを使う方法


はじめに

DMM WEBCAMP Advent Calendar 2020 12日目の担当をさせていただきます !
DMM WEBCAMPメンターのSawaです !

アプリ開発にてデータベース上で複数のテーブルを使用しているとき
「このページだけ1つのテーブルにまとめたいなぁ...」
そんなことを思ったことはないでしょうか?

そこで今回は
使いそうで使わない、でも知っておいて損はない
『Temporary Table』

についてまとめていきます

Temporary Tableとは?

Railsを使用したwebアプリでは通常データベース(SQLite, MySQLなど)にデータをに保存していきます。
基本的にはあらかじめテーブルを作成しておき、そこにデータを新規作成、更新していきます。
一方でデータベースには一時的にテーブルを作成し、必要な時のみテーブルを利用できる機能を備えています。
その機能こそ今回ご紹介する『Temporary Table』なのです!

Railsで使ってみる

Railsでデータベースを使用する際にはActiveRecordを使用します。
ActiveRecordについてはこちらの記事が分かりやすかったため参考にされるといいかと思います。

またRails5系からはActiveRecord::Baseを継承したApplicationRecordを使うことができるため、本記事ではApplicationRecordを使用していきます。

ApplicationRecordを使ったTemporary Tableの作成

今回はeventsテーブルをTemporary Tableとして作成することとします。
カラムとしてtitle, bodyカラムを用意してみました。

temporary_tables_controller.rb
ApplicationRecord.connection.create_table('events', temporary: true, force: true) do |t|
    t.string :title
    t.text   :body
    t.timestamps
end

1行目ではApplicationRecordを呼び出し、データベースに接続をしてテーブルを作成しています。
SQLite、MySQL ではtemporary: trueとするだけでtemporary tableが作れてしまいます
(MySQLの場合、デフォルトとしてtemporary tableの使用権限がありません。MySQLにログインをし、権限の変更が必要になります。)

オプションとしてforce: trueを使用していますが、これは既存のテーブルがある際に一度削除をして作り直すことを意味していますのでお忘れなく。

次に作成したTemporary TableをApplicationRecoredに紐づけていきます。
(イメージとしてはモデルを作る感じです)

temporary_tables_controller.rb
Object.const_set('Event', Class.new(ApplicationRecord))

Object.const_setは動的にクラスを生成できるメソッドであり、ApplicationRecordを継承したEventクラスを作成しています。
これは

terminal
$ rails g model Event
event.rb
class Event < ApplicationRecord
end

を動的に処理しているのと同様の意味を持ちます。

以上の工程でTemporary TableがRailsで使えるようになります!

実際に使ってみる

それでは実際にRailsでTemporary Tableを使ってみましょう!
今回は以下のようなコードを組んでみました。
Temporary Tableを作って、そこに新規データを入れていきます。

実行環境:Rails 5.2 , SQLite3

temporary_tables_controller.rb
def event
    ApplicationRecord.connection.create_table('events', temporary: true, force: true) do |t|
        t.string :title
        t.text   :body
        t.timestamps
    end

    Object.const_set('Event', Class.new(ApplicationRecord))

    @events = Event.create([
        {title: "hoge-1", body: "fuga-1"},
        {title: "hoge-2", body: "fuga-2"},
        {title: "hoge-3", body: "fuga-3"}
        ])
end
event.html.erb
<% @events.each do |event| %>
    <%= event.title %>
    <%= event.body %><br>
<% end %>

動作確認をしてみると以下のように表示されました。しっかりとTemporary Tableが作成されて、データが保存できていますね!

ターミナル:

画面表示:

さいごに

本日はTemporary Tableについてまとめてみました!いかがでしたでしょうか?

私は以前simple calenderを利用したアプリ開発を行っており、カレンダーに予定を入れるためにはモデルを1つにしなくてはなりませんでした...
その際にこのTempolary Tableが大活躍をしたのです!

知っておくとどこかで役に立つかもしれませんね