如何根据原始值验证rails模型,但存储已处理的值

时间:2010-08-09 23:07:41

标签: ruby-on-rails activerecord

我正在以铁轨形式与持续时间进行交互,目前它是一个文本框,格式需要MM:SS

我有验证器:

validates_format_of :time, :with => /^[0-9]?[0-9]{1}[:][0-9]{2}$/, :allow_nil => true, :allow_blank => true, :message => 'format must be MM:SS'

虽然我想将它作为整数(秒)存储在数据库中,以便更容易对该字段进行报告。

我将访问者覆盖为:

 def time=(new_time)
   parts = new_time.split(':')
   write_attribute(:time, (parts[0].to_i * 60) + parts[1].to_i)
 end

 def time
   Time.at(read_attribute(:time).to_i).gmtime.strftime('%R:%S')
 end

但它最终会发送验证错误,因为time属性在time =方法设置之后只是一个整数。

如何在几秒钟内在数据库中存储持续时间值,但仍然以不同的格式(MM:SS)强制执行验证?

1 个答案:

答案 0 :(得分:0)

我不知道这是否是最佳解决方案,但我相信您可以使用after_validation,如下所示:

after_validation :convert_time_to_integer

def convert_time_to_integer
   parts = self.split(':')
   write_attribute(:time, (parts[0].to_i * 60) + parts[1].to_i)
end