、あなたはISO8601文字列としてactivesupportの::期間を格納する属性:: ActiveRecordを使用することができます。整数よりも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
+1私の短い時間で私の同じコメントを投稿してください! :) –
私は秒を使用することを決してしなかった、doh!ヒントをありがとう! – mwilliams
出力をフォーマットするのに 'inspect'をどのように使いますか?例? –