ちょっとわけあって、1セッションのみで使うTableを動的に作ってすぐ捨てる必要ができた。1セッションのみで使うテーブルは、MySQLのTemporaryTableを使い、さらにActiveRecordとして使えるようにして実現したのでメモ。
Temporary Table
TEMPORARY テーブルは現在のセッションにのみ表示され、そのセッションが閉じられると自動的に削除されます。つまり、2 つの異なるセッションが同じ一時テーブル名を使用することができ、互いに、または同じ名前の既存の TEMPORARY 以外のテーブルと競合することはありません。(既存のテーブルは、一時テーブルが削除されるまで非表示になります。)一時テーブルを作成するには、CREATE TEMPORARY TABLES 権限が必要です。
13.1.17 CREATE TABLE 構文 の一時テーブルの章
動的にTemporaryTable作ってActiveRecord化するサンプルコード
# temporary table 'tmp_tables'の作成
ActiveRecord::Base.connection.create_table('tmp_tables', temporary: true) do |t|
t.date :date
end
# 作成したtemporary tableをActiveRecordに紐付ける。モデル名はTmpTable。
klass = Class.new(ActiveRecord::Base) do |c|
c.table_name = 'tmp_tables'
end
Object.const_set('TmpTable', klass)
# 試しに使ってみる
TmpTable.new(date: Date.today).save!
pp TmpTable.all
# -> [#<TmpTable:0x00007feb594af550 id: 1, date: Thu, 13 Dec 2018>]