处理Ruby ActiveRecord中的列转换

时间:2012-01-11 20:49:00

标签: ruby-on-rails ruby activerecord legacy-database

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

1 个答案:

答案 0 :(得分:0)

如果您被迫处理遗留数据,我会看到两种管理方式。

1从您的数据库

您可以通过查看表格来“转换”您的数据,从而动态转换您的(日期)字段。然后在此视图上触发(插入/更新之前),将数据转换回旧格式。最后,您告诉ActiveRecord使用您的视图而不是您的表。

2从您的应用程序(Rails)

找一种方法告诉ActiveRecord做同样的工作。您是否已尝试使用 after_initialize before_save 进行AR回调管理?更多信息here