Rails - 自定义唯一性验证

Rails - Custom validation of uniqueness

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

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

如您所述,您需要创建自定义验证器并使用 validates_with。有关信息在这里:

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

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

Rails回调顺序为:

(-) save

(-) valid

(1) before_validation

(-) validate

(2) after_validation

(3) before_save

(4) before_create

(-) 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

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