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
因此它将完全按照您的描述工作,并且不需要编写和自定义验证。会更漂亮!
我想在列(字符串类型)上赋予唯一性,但是问题出在某些字符串上,我在使用函数将它们插入数据库之前截断了开头的一部分 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
因此它将完全按照您的描述工作,并且不需要编写和自定义验证。会更漂亮!