2

在处理旧数据库时,我遇到了 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.:
4

1 回答 1

0

如果您被迫处理遗留数据,我看到了两种管理它的可能性。

1 从您的数据库中

您可以通过查看表格来“转换”您的数据,该表格可以即时转换您的(日期)字段。然后你在这个视图上创建一个触发器(在插入/更新之前),将你的数据转换回你的旧格式。最后你告诉 ActiveRecord 使用你的视图而不是你的表。

2 从您的应用程序(Rails)

想办法告诉 ActiveRecord 做同样的工作。您是否已经尝试使用带有after_initializebefore_save的 AR 回调来管理它?更多信息在这里

于 2012-01-12T22:56:16.280 回答