Работа с преобразованиями столбцов в Ruby ActiveRecord - PullRequest
2 голосов
/ 12 января 2012

Имея дело с устаревшей базой данных, я натолкнулся на столбец в базе данных 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.:

1 Ответ

0 голосов
/ 13 января 2012

Если вы вынуждены иметь дело с устаревшими данными, я вижу две возможности управлять ими.

1 Из вашей базы данных

Вы можете "преобразовать" свои данные с помощьюсоздание таблицы, которая конвертирует ваши поля (даты) на лету.Затем вы делаете триггер (перед вставкой / обновлением) в этом представлении, который преобразует ваши данные обратно в ваш старый формат.Наконец, вы указываете ActiveRecord использовать ваше представление вместо таблицы.

2 Из вашего приложения (Rails)

Найдите способ заставить ActiveRecord выполнять ту же работу.Вы уже пытались управлять им с помощью обратных вызовов AR с after_initialize и before_save ?Больше информации здесь

...