1

我想在列(类型字符串)上赋予唯一性,但是问题出在一些字符串上,我在使用函数将它们插入数据库之前截断了开头的一部分,并且before_save. 因此,rails 唯一性验证不起作用,因为输入可能与数据库中的不同,即使在截断/格式化之后,它们应该是相同的。

我希望能够先截断我的字符串,然后验证它的唯一性,但是我不确定是否可以使用 rails validates uniqueness: true。我只需要写一个自定义validate吗?

4

2 回答 2

2

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

因此它将完全按照您的描述工作,并且不需要编写和自定义验证。会更漂亮!

于 2016-05-28T01:39:01.853 回答
1

正如您所提到的,您需要创建一个自定义验证器并使用 validates_with。相关信息在这里:

http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_with

为了遵循 DRY 原则,并确保对截断逻辑的任何更改都反映在验证器和 before_save 回调中,我建议创建一个返回截断字符串的方法,并在验证器和回调中使用相同的方法。

于 2016-05-28T01:18:58.523 回答