2016-05-28 145 views
1

我想在列(類型字符串)上賦予唯一性,但問題出在我使用函數將數據插入數據庫之前截斷部分開始部分的字符串,並且before_save 。因此,軌道唯一性驗證不起作用,因爲輸入可能與數據庫中的輸入不同,即使在截斷/格式化後它們應該是相同的。Rails-唯一性的自定義驗證

我希望能夠先截斷我的字符串,然後驗證它的唯一性,但我不確定是否可以使用導軌validates uniqueness: true。我只需要寫一個自定義的validate

回答

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

正如您所提到的,您需要創建自定義驗證器並使用validates_with。有關的信息是在這裏:

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

要遵循DRY原則,並確保反映在您的驗證和你before_save回調既您的截斷邏輯的任何變化,我建議創建返回截斷的方法字符串,並在驗證器和回調中使用相同的方法。