В Rails 5 вы можете использовать ActiveRecord :: Attributes для хранения ActiveSupport :: Durations в виде строк ISO8601. Преимущество использования ActiveSupport :: Duration перед целыми числами состоит в том, что вы можете использовать их для вычисления даты / времени прямо из коробки. Вы можете делать такие вещи, как Time.now + 1.month
, и это всегда правильно.
Вот как:
Добавить config/initializers/duration_type.rb
class DurationType < ActiveRecord::Type::String
def cast(value)
return value if value.blank? || value.is_a?(ActiveSupport::Duration)
ActiveSupport::Duration.parse(value)
end
def serialize(duration)
duration ? duration.iso8601 : nil
end
end
ActiveRecord::Type.register(:duration, DurationType)
Миграция
create_table :somethings do |t|
t.string :duration
end
Модель
class Something < ApplicationRecord
attribute :duration, :duration
end
Использование
something = Something.new
something.duration = 1.year # 1 year
something.duration = nil
something.duration = "P2M3D" # 2 months, 3 days (ISO8601 string)
Time.now + something.duration # calculation is always correct