在Ruby on Rails中将HH:MM Time转换为Decimal的before_save

时间:2012-12-28 00:45:02

标签: ruby-on-rails ruby

我的持续时间字段是我数据库中的十进制数据类型。

我的表格接受小数(例如1.5小时)但我也希望能够接受 HH:MM (例如1:30一小时三十分钟)

我希望能够在我的模型中使用before_save上的正则表达式检测HH:MM并将其转换为十进制,以便用户可以输入十进制或HH:MM。这部分很好,但是我遇到的问题是测试正则表达式与该字段中的值。

1:30被解释为数据类型--- !ruby/class 'BigDecimal',我无法对正则表达式进行测试。

对其执行.to_s会将其转换为1.0

如何让我的十进制类型字段放松,让我将其值转换为字符串,以便在我的模型中进行正则表达式测试?

这是我的代码:

# --- Model ---
before_save :convert_duration

def convert_duration
  if duration =~ /^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/
    time_pieces = duration.split(":")
    hours = time_pieces[0].to_i
    minutes = (time_pieces[1].to_f/60.0)

    # Final value ready for database
    self.duration = (hours+minutes).round(1)
  end
end

Ruby 1.9.3; Rails 3.2.8

1 个答案:

答案 0 :(得分:2)

如果要访问原始字符串,请使用duration_before_type_cast属性。

文档:http://api.rubyonrails.org/classes/ActiveRecord/Base.html#label-Accessing+attributes+before+they+have+been+typecasted