レガシーデータベースを扱っていると、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.: