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