嗯,我在postgres上有一个名为birthday的专栏,我选择了日期类型的列
但是,例如,它的输入(在应用层)可以是"10-10-10“。
因此,我在我的模型before_validation :parse_birthday上创建了一个回调,将字符串转换为有效的字符串。
def parse_birthday
puts self.birthday
self.birthday = Chronic::parse(self.birthday)
...
end但是在回调内部,生日是null,因为我猜DB列类型拒绝日期和破折号,而且我无法在它之前进行解析。
那么,如果不将列类型更改为变化的字符,如何才能做到这一点呢?
谢谢!
发布于 2014-05-06 19:56:47
在您的模型中,您可以重写birthday的getter和setter方法,如下所示:
def birthday
read_attribute(:birthday) || read_attribute_before_type_cast(:birthday)
end
def birthday=(_birthday)
write_attribute(:birthday, (Chronic.parse(_birthday) || _birthday)) if _birthday
end这意味着,如果由于日期的值是无稽之谈而导致慢性解析失败,它将失败,因为它将成为零,但用户输入的值将返回到模型中,以便在表单上重新显示。
发布于 2014-05-06 19:57:16
您可以做的一件事是覆盖默认的setter,尝试如下所示
def birthday=(birthday_input)
write_attribute(:birthday, Chronic::parse(birthday_input))
end这样,它将直接写入您想要的,并且您的验证可以在事实之后运行。
https://stackoverflow.com/questions/23503671
复制相似问题