2013-05-29 45 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 =>'选项。 –

相关问题