处理遗留数据库时,我遇到了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.:
答案 0 :(得分:0)
如果您被迫处理遗留数据,我会看到两种管理方式。
1从您的数据库
您可以通过查看表格来“转换”您的数据,从而动态转换您的(日期)字段。然后在此视图上触发(插入/更新之前),将数据转换回旧格式。最后,您告诉ActiveRecord使用您的视图而不是您的表。
2从您的应用程序(Rails)
找一种方法告诉ActiveRecord做同样的工作。您是否已尝试使用 after_initialize 和 before_save 进行AR回调管理?更多信息here