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 とかやってて、クラス名が違っていたのを訂正。