我想在列(类型字符串)上赋予唯一性,但问题在于某些字符串我在使用函数将before_save
插入数据库之前截断部分开头。因此,轨道唯一性验证不起作用,因为输入可能与数据库中的内容不同,即使在截断/格式化之后,它们应该是相同的。
我希望能够首先截断我的字符串,然后验证它的唯一性,但是我不确定它是否可以使用rails validates uniqueness: true
。我只需要编写自定义validate
吗?
答案 0 :(得分:2)
Rails回调的顺序是:
( - )保存
( - )有效
(1)before_validation
( - )验证
(2)after_validation
(3)before_save
(4)before_create
( - )创建
(5)after_create
(6)after_save
(7)after_commit
详情为here。所以你只需要做一些事情:
validates :your_data_field, uniqueness: true
before_validation :normalize_data
def normalize_data
# Normalize your data here
end
因此它将完全按照您的描述工作,并且不需要编写和自定义验证。它会更漂亮!
答案 1 :(得分:1)
正如您所提到的,您需要创建自定义验证程序并使用validates_with。有关这方面的信息在这里:
http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_with
要遵循DRY原则,并确保截断逻辑的任何更改都反映在验证器和before_save回调中,我建议创建一个返回截断字符串的方法,并在验证器中使用相同的方法回调。