2013-05-29 69 views
0

我應該如何設置我的模型,以便在創建記錄時設置給定字段的默認值我可以在該字段上運行驗證?在創建時爲模型設置默認值的正確方法是什麼?

作爲一個例子,假設我有一個字段bar,如果在創建記錄時沒有給定值,我想默認爲0。我也想確保吧不是零,validates_presence_of :bar

如果我這樣做:

before_create :defaults 
def defaults 
    bar ||= 0 
end 

...那麼默認永遠不會奏效;驗證失敗,因爲bar在調用默認值之前是零。

但是,如果我這樣做:

before_validation :defaults 
def defaults 
    bar ||= 0 
end 

,則默認被設置驗證,這使得下面產生一些奇怪的結果之前:

foo = Foo.new 
foo.bar = nil 
foo.save! 

而不是引發異常,因爲您試圖將bar設置爲無效值,保存成功並將bar設置爲0.

我想我可以做到這一點:

before_validation :defaults 
def defaults 
    if new_record? 
    bar ||= 0 
    # set any other default values 
    end 
end 

......但似乎有點臭,更不用說低效(這是我關心的只是在創建過程中被調用每一個驗證)。

有一些更優雅的方式,我可以有欄默認爲0 之前驗證檢查和只在創作

+0

我不會說這是非常低效的。該方法提前退出。我猜測你的代碼在'Foo#save'中花費的時間與其他工作相比可以忽略不計。我保持原樣(因爲我知道沒有更好的辦法)。 –

回答

1

before_validation :defaults, :on => :create,它只在創建時被調用。

+0

啊,謝謝!我沒有意識到before_validation有一個':on =>'選項。 –

相關問題