2

レガシーデータベースを扱っていると、SQLServerデータベースで日付が小数で格納されている列に出くわしました。例:2011-04-23は20110423.0として保存されます。

「奇妙な」列ストレージ規則を処理するための一般的なActiveRecordメカニズムはありますか?実際に整数として格納される列挙型のような列も同じメカニズムを利用する可能性がある別のケースですが、探しているものがまったく見つかりません。

シリアル化によって部分的にそこに到達したようです。

class Thing < ActiveRecord::Base
  class DecimalDate
    def load(date)
      if date.is_a? Numeric
        y,m,d = /^(\d\d\d\d)(\d\d)(\d\d)/.match(date.to_s)[1..3].map(&:to_i)
        Date.civil(y,m,d)
      end
    end
    def dump(date)
      date ? date.strftime('%Y%m%d').to_i : 0
    end
  end
  serialize :weird_date, DecimalDate
end

rails c
> Thing.first.weird_date
=> Sun, 02 Jan 2011

しかし、幻想は薄いです。列は、それが小数として格納された日付であることを「認識」していません。例:比較は失敗します:

rails c
> Thing.where('weird_date > ?', 1.week.ago)
...
ActiveRecord::StatementInvalid: ... Error converting data type varchar to numeric.:
4

1 に答える 1

0

レガシーデータを処理することを余儀なくされた場合、それを管理するための2つの可能性があります。

1データベースから

(日付)フィールドをその場で変換するテーブルのビューを作成することにより、データを「変換」できます。次に、このビューで(挿入/更新の前に)トリガーを作成して、データを古い形式に戻します。最後に、テーブルの代わりにビューを使用するようにActiveRecordに指示します。

2アプリケーションから(Rails)

ActiveRecordに同じ仕事をするように指示する方法を見つけてください。after_initializebefore_saveを使用したARコールバックでそれを管理しようとしましたか?詳細はこちら

于 2012-01-12T22:56:16.280 に答える