【问题标题】:Adding a string into time member and saving to database将字符串添加到时间成员并保存到数据库
【发布时间】:2013-04-03 01:29:33
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    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
    

    【讨论】:

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

    你可以这样做

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-21
      • 2018-09-08
      • 2018-09-21
      • 2012-07-04
      • 2015-11-28
      • 2016-03-23
      • 1970-01-01
      相关资源
      最近更新 更多