##はじめに
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カラムを用意してみました。
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に紐づけていきます。
(イメージとしてはモデルを作る感じです)
Object.const_set('Event', Class.new(ApplicationRecord))
Object.const_setは動的にクラスを生成できるメソッドであり、ApplicationRecordを継承したEventクラスを作成しています。
これは
$ rails g model Event
class Event < ApplicationRecord
end
を動的に処理しているのと同様の意味を持ちます。
以上の工程でTemporary TableがRailsで使えるようになります!
###実際に使ってみる
それでは実際にRailsでTemporary Tableを使ってみましょう!
今回は以下のようなコードを組んでみました。
Temporary Tableを作って、そこに新規データを入れていきます。
実行環境:Rails 5.2 , SQLite3
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
<% @events.each do |event| %>
<%= event.title %>
<%= event.body %><br>
<% end %>
動作確認をしてみると以下のように表示されました。しっかりとTemporary Tableが作成されて、データが保存できていますね!
##さいごに
本日はTemporary Tableについてまとめてみました!いかがでしたでしょうか?
私は以前simple calenderを利用したアプリ開発を行っており、カレンダーに予定を入れるためにはモデルを1つにしなくてはなりませんでした...
その際にこのTempolary Tableが大活躍をしたのです!
知っておくとどこかで役に立つかもしれませんね