環境:
Rails 2.3.2
DBI 0.4.1
DBD/ODBC 0.2.4
シナリオ:
通常のバッチ ジョブを使用して、ほとんどのデータを外部 SQL DB から Rails SQL DB にインポートする Rails アプリがあります。これらのバッチ ジョブは、Rails 環境をロードすることから始まり、RubyDBI を介してデータベースに直接接続します。接続したら、select ステートメントを実行してデータを抽出し、データを処理して、ActiveRecord オブジェクトを構築します。
開発時と本番環境で動作が異なるという奇妙な問題に遭遇しました。config.cache_classes が true の場合、DBI は返された SQL DATETIME 型を Ruby 日時に適切に強制するのを停止するようです。抽出されたコード例を次に示します。
## config.cache_classes = true
query = "select TOP 1 [EPOLeafNode].[Lastupdate] AS last_update from [EPOLeafNode]"
conn = DBI.connect('dbi:ODBC:DRIVER=FreeTDS;TDS_Version=8.0;SERVER=sql;DATABASE=EOP;uid=uid;pwd=pwd;')
conn.select_one(query)
=> ["2008-11-05 20:53:26.000"]
## config.cache_classes = false
query = "select TOP 1 [EPOLeafNode].[Lastupdate] AS last_update from [EPOLeafNode]"
conn = DBI.connect('dbi:ODBC:DRIVER=FreeTDS;TDS_Version=8.0;SERVER=sql;DATABASE=EOP;uid=uid;pwd=pwd;')
conn.select_one(query)
=> [[Wed, 05 Nov 2008 20:53:26 +0000]]
これはバグですか、それとも私が理解できない予想される動作ですか? できれば常にデータを強制するために、オーバーライドできますか? そうでない場合、開発と本番で同じ結果が得られるようにデータをマッサージする最善の方法について何か考えはありますか?