Обходной путь, который может помочь:
Сначала создайте миграцию, выполнив:
rename_column :the_models, :time, :old_time
add_column :the_models, :time, :time
Итак, теперь модель будет иметь поле с именем old_time
, содержащее исходные данные времени, и новое поле time
с правильным типом поля.
В результате существующие формы кажутся потерянными за все время, но по крайней мере они вызывают the_model.time
, чтобы получить результат.
Реальная работа вокруг части:
class TheModel < ActiveRecord::Base
def time
read_attribute(:time) || Time.parse(read_attribute(:old_time))
end
end
Так что теперь значение времени будет сохранено в поле time
.
Когда time
равен нулю, он попытается получить значение времени из old_time
и преобразовать его в объект времени.
Есть два недостатка:
- Time.parse ("12:34") даст вам что-то вроде:
2010-12-14 12:34:00 +0800
Поскольку вы указали только часы и минуты, другие поля ненадежны.
- В базе данных есть почти устаревшее поле с именем
old_time
. Поэтому в будущем вы можете захотеть полностью удалить это поле после того, как будете уверены, что все значения old_time
были преобразованы в поле time
.
Еще одно примечание:
Вы должны преобразовать существующие формы для поля :time
, которое, вероятно, использует text_field.
Поле text_ может показывать что-то вроде 2010-12-14 12:34:00 +0800
.
Если вы действительно хотите использовать text_field, вы можете:
def time
t = read_attribute(:time)
t.nil? ? read_attribute(:old_time) : t.strftime("%H:%M")
end
def time=(val)
write_attribute(:time, Time.parse(val))
end