首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在数据库上的列类型验证之前,如何解析rails上的模型属性?

在数据库上的列类型验证之前,如何解析rails上的模型属性?
EN

Stack Overflow用户
提问于 2014-05-06 19:49:42
回答 2查看 251关注 0票数 0

嗯,我在postgres上有一个名为birthday的专栏,我选择了日期类型的列

但是,例如,它的输入(在应用层)可以是"10-10-10“。

因此,我在我的模型before_validation :parse_birthday上创建了一个回调,将字符串转换为有效的字符串。

代码语言:javascript
复制
def parse_birthday
   puts self.birthday
   self.birthday = Chronic::parse(self.birthday)
   ...
end

但是在回调内部,生日是null,因为我猜DB列类型拒绝日期和破折号,而且我无法在它之前进行解析。

那么,如果不将列类型更改为变化的字符,如何才能做到这一点呢?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-06 19:56:47

在您的模型中,您可以重写birthday的getter和setter方法,如下所示:

代码语言:javascript
复制
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

这意味着,如果由于日期的值是无稽之谈而导致慢性解析失败,它将失败,因为它将成为零,但用户输入的值将返回到模型中,以便在表单上重新显示。

票数 2
EN

Stack Overflow用户

发布于 2014-05-06 19:57:16

您可以做的一件事是覆盖默认的setter,尝试如下所示

代码语言:javascript
复制
  def birthday=(birthday_input)
    write_attribute(:birthday, Chronic::parse(birthday_input))
  end

这样,它将直接写入您想要的,并且您的验证可以在事实之后运行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23503671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档