在处理旧数据库时,我遇到了 SQL Server 数据库中的一列,其中日期以小数形式存储。例如 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.: