我的数据库表中有一个duration
列,我要在其中插入一个时间跨度,如02:00或19:20(小时和分钟),列类型为时间。用户会看到一个包含两个下拉列表的表单,一个用于分钟,一个用于小时:
=f.select :durationhours, options_for_select((0..23).to_a)
=f.select :durationminutes, options_for_select((0..59).to_a)
表单是使用form_for生成的,我的数据库中没有任何durationminutes或durationhours,所以我在我的模型中使用validates_acceptance_of。
attr_accessible :durationhours, :durationminutes #not sure this line is necessary
validates_acceptance_of :durationhours, :durationminutes
当提交表单时,我试图将小时和分钟放在一起并将它们保存到数据库中,但这是失败的,没有显示任何错误(终端中仅提到回滚)。我想做的是:
@record.duration = params[:record][:durationhours].to_s.rjust(2, "0") + ":" + params[:record][:durationminutes].to_s.rjust(2, "0")
# but I even tried this, and it doesn't work:
@record.duration = "13:30"
如果没有上面我手动设置持续时间的行,@record.save
工作正常。执行保存后,这是我在@record.errors.inspect
时遇到的错误:
#<ActiveModel::Errors:0x10ba5be08 @messages=#<OrderedHash {:durationhours=>["must be accepted"],
:durationminutes=>["must be accepted"]}>, @base=#<Record id: nil, details: "",
happened: "2013-04-11 02:19:10", duration: "2000-01-01 12:12:00", activity_id: 17,
created_at: nil, updated_at: nil, price: nil>>
答案 0 :(得分:0)
validates_acceptance_of
不是您要在此处使用的验证。该验证器验证是否设置了布尔值。
那就是说,不要创建字符串,而是考虑将持续时间存储为整数。
self.duration = self.durationminutes.to_i.minutes + self.durationseconds.to_i
这将为您提供以秒为单位的持续时间,您可以将其存储在数据库的单个整数字段中。
durationminutes = 10
durationseconds = 24
duration = durationminutes.minutes + durationseconds
=> 624
624 / 1.minute => 10
624 - 10.minutes => 24
答案 1 :(得分:0)
你可以这样做
irb> time = '20'.to_i.hours + '05'.to_i.minutes
=> 72300 seconds
irb> Time.at time
=> 1970-01-01 21:05:00 +0100
我不确定为什么它会在我的控制台上改为+1时间,但你可以通过这样做来获得utc:
irb> Time.at(time).utc
=> 1970-01-01 20:05:00 UTC