ActiveRecordでset_table_nameを使わずにテーブル名を変えてクエリを実行する

Rails 3.1.3で試した。

影響の大きいset_table_nameを使わずに、O/RマッパーとかSQL生成とかActiveRecordの便利な機能を使いつつ、別名のテーブルにクエリを実行する。

# "Hoge"というモデルがあって、デフォルトで関連づけられた "hoges" テーブルではなく、
# "hoges_2012" という別テーブルにアクセスする例。
target_table = "hoges_2012"
record = Hoge.where(id:1)
result = record.find_by_sql( record.to_sql.gsub( record.table_name, target_table ) )

できたー\(^O^)/
テキストを置換して強引にやってるので、その分負荷があるからOLTPなサービスとかでは使いづらいけど、裏側で回す解析処理とかならこれで十分。