Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 将字符串添加到时间成员并保存到数据库_Ruby_Ruby On Rails 3_String_Time_Save - Fatal编程技术网

Ruby 将字符串添加到时间成员并保存到数据库

Ruby 将字符串添加到时间成员并保存到数据库,ruby,ruby-on-rails-3,string,time,save,Ruby,Ruby On Rails 3,String,Time,Save,我的数据库表中有一个duration列,我想在其中插入一个时间跨度,如02:00或19:20(小时和分钟),列类型是time。用户看到的表单有两个下拉列表,一个用于分钟,一个用于小时: =f.select :durationhours, options_for_select((0..23).to_a) =f.select :durationminutes, options_for_select((0..59).to_a) 表单是使用表单_for生成的,我的数据库中没有任何durationmin

我的数据库表中有一个
duration
列,我想在其中插入一个时间跨度,如02:00或19:20(小时和分钟),列类型是time。用户看到的表单有两个下拉列表,一个用于分钟,一个用于小时:

=f.select :durationhours, options_for_select((0..23).to_a)
=f.select :durationminutes, options_for_select((0..59).to_a)
表单是使用表单_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中遇到的错误。执行保存后检查

#<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>>
#[“必须接受”]}>,@base=#>

验证
的可接受性并不是您希望在此处使用的验证。该验证器验证是否设置了布尔值

,不是创建一个字符串,而是考虑将您的持续时间存储为整数。< /P>

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

你可以这样做

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

但是如果没有
validates\u acceptance\u of
,我就无法在我的表单中添加小时和分钟下拉列表(用于expects表列的表单),那么我该怎么做呢?添加
attr\u访问器:durationhours,:durationminutes
(不要与
attr\u accessible
混淆。这将在该类的实例上为这些属性创建getter和setter。确保也保留
attr\u accessible
指令。两者都需要。
accessor
创建getter和setter,
accessible
告诉Rails可以批量分配它们。是的我刚想出来,不过谢谢你的快速回复:)最后一个问题:你知道为什么要在数字前加三个减号吗?我甚至尝试先清除持续时间,但它一直在数据库中的数字前加上
--
。我只是在使用
@record.duration=hh.to_I.hours+mm.to_I.minutes
,这听起来像是你的值在存储到之前被序列化到YAMLDB。您是否将列类型更改为整数?