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