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