我有一個before_create函數,我正在使用它來填充表格中的一列。例如 before_create:generate_number在rails中創建之前的自定義驗證
def generate_number
end
我想基於一個條件之前其填充檢查列的唯一性。
例如:如果數據庫2年創建數年前,我不希望它
我怎麼能寫一個自定義的驗證它要應用的唯一性驗證。我應該在哪裏包括它?
我有一個before_create函數,我正在使用它來填充表格中的一列。例如 before_create:generate_number在rails中創建之前的自定義驗證
def generate_number
end
我想基於一個條件之前其填充檢查列的唯一性。
例如:如果數據庫2年創建數年前,我不希望它
我怎麼能寫一個自定義的驗證它要應用的唯一性驗證。我應該在哪裏包括它?
您可以使用unless
或if
應用邏輯來驗證:
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
既然你在指定的評論您希望它繼續生成數字,直到生成一個尚未在數據庫中的數字:
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條件的目的,如果您想指定它應該如何工作,我可以修改該部分。否則,我只會將其視爲一個例子,而不是實際問題的一部分。
是的,我想要防止它再次創建並調用隨機函數,以便在驗證不滿足時生成一個不同的數字 –
好了,我已經更新了包含循環的答案,以便繼續生成,直到它創建一個數字尚未在數據庫中。 – MTarantini
在這種情況下,如果它不符合驗證,它會將名稱留空嗎? –