将字符串添加到time member并保存到数据库

时间:2013-04-11 00:29:38

标签: ruby ruby-on-rails-3 string time save

我的数据库表中有一个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>>

2 个答案:

答案 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