0

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

2 回答 2

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
于 2013-04-11T00:41:31.023 回答
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
于 2013-04-11T00:43:22.157 回答