2016-04-01 31 views
0

我有一個before_create函數,我正在使用它來填充表格中的一列。例如 before_create:generate_number在rails中創建之前的自定義驗證

def generate_number 

    end 

我想基於一個條件之前其填充檢查列的唯一性。

例如:如果數據庫2年創建數年前,我不希望它

我怎麼能寫一個自定義的驗證它要應用的唯一性驗證。我應該在哪裏包括它?

回答

0

您可以使用unlessif應用邏輯來驗證:

validate_uniqueness_of :column_name, unless: -> { created_at < 2.years.ago } 

這會去你的ActiveRecord模型以同樣的方式爲您before_create

class User < ActiveRecord::Base 
    #... 

    validate_uniqueness_of :column_name, unless: -> { created_at < 2.years.ago } 
end 
+0

在這種情況下,如果它不符合驗證,它會將名稱留空嗎? –

0

既然你在指定的評論您希望它繼續生成數字,直到生成一個尚未在數據庫中的數字:

def generate_number 
    begin 
    value = generate 
    end while created_at < 2.years.ago && Table.exists?(column: value) 
    self.column = value 
end 

def generate 
    ... # Code to generate number here 
end 

繼續循環while created_at列早於2年前生成的數字在數據庫中。我把while條件放在底部,這樣generate在檢查前至少會運行一次。

我仍然不明白created_at條件的目的,如果您想指定它應該如何工作,我可以修改該部分。否則,我只會將其視爲一個例子,而不是實際問題的一部分。

+0

是的,我想要防止它再次創建並調用隨機函數,以便在驗證不滿足時生成一個不同的數字 –

+0

好了,我已經更新了包含循環的答案,以便繼續生成,直到它創建一個數字尚未在數據庫中。 – MTarantini