Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.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 on rails 如何根据原始值验证rails模型,但存储处理后的值_Ruby On Rails_Activerecord - Fatal编程技术网

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

Ruby on rails 如何根据原始值验证rails模型,但存储处理后的值,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我正在rails表单中与一个持续时间进行交互,目前它是一个文本框,格式要求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' 虽然我希望将其作为整数(秒)存储在数据库中,以便更容易对该字段进行报告 我将访问者改写

我正在rails表单中与一个持续时间进行交互,目前它是一个文本框,格式要求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)执行验证?

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

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