Имея дело с устаревшей базой данных, я натолкнулся на столбец в базе данных SQL Server, где дата хранится в виде десятичной дроби.Например, 2011-04-23 хранится как 20110423.0.
Существует ли общий механизм ActiveRecord для работы со "странными" соглашениями о хранении столбцов?Enum-подобные столбцы, в которых они на самом деле хранятся как целые числа, - это еще один случай, в котором также может использоваться тот же механизм, но я не могу найти то, что ищу.меня отчасти нет:
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.: