Rails(というかAcriveRecord)で日次テーブルに書き込む(保存時に保存先テーブル名を変更する)
Rails 3.2.2で試した。
ログテーブルのように日次で保存先を切り替える需要があります。
ActiveRecordは通常、クラス名とテーブル名が一対一で関連付いているので、切り替えは切り替えを書いてあげる必要があります。
set_table_nameをクラス定義部分で書く方法がありますが、これだと最初のアクセス時にそのテーブルを使うようになりますが、以降はずっとそのままです。
対策として、毎日再起動すると切り替えが可能です。
可能ですが。
いかに unicorn が kill -s USR2 とかで安全に再起動できたとしても、やっぱり気持ち悪いですね。
あと、切り替わりタイミングが再起動時に限定されてしまいます。
もう一つの方法として、before_create コールバックを利用する方法を今回試しました。
↓こんな具合。
class Foo < ActiveRecord::Base before_create :change_table def change_table Foo.set_table_name "bars" if Foo.table_name != "bars" end end
これで Foo.create とか、Foo.new.save とかやると、bars テーブルに書き込みます。
あとは、"bars" の部分を、日次で変わる文字列にしてあげれば良い。
※ちなみに、この例だと、barsテーブルのほかに、Fooクラスに対応するfoosテーブルが無いとエラーになります。
あと、set_table_name でセットしたテーブル名は、セッション単位ではなく、 unicorn プロセス単位で有効、つまり、変更したらずっとそのままなので、そのつもりで扱うべし。
まあ、brefore_create で毎回変更していれば気にならないかもしれないけど。
ただし、(ログだし、普通あり得ないけど、)万が一日付をさかのぼってログを追記したい時とかは、before_create コールバックを外してやる必要があります。
Rails.envでbefore_createを呼ばない分岐作っても良いですね。
※2012/5/6、change_tableメソッド内、Foo.set_table_name ってするところを Blog.set_table_name とかやってて、クラス名が違っていたのを訂正。