Rails - 自定义唯一性验证

时间:2016-05-28 01:14:12

标签: ruby-on-rails validates-uniqueness-of

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

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

2 个答案:

答案 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回调中,我建议创建一个返回截断字符串的方法,并在验证器中使用相同的方法回调。