我应该如何设置我的模型,以便在创建记录时设置给定字段的默认值,并且我可以在该字段上运行验证?
例如,假设我有一个字段bar
,如果在创建记录时没有给出值,我想将其默认为 0。我还想确保 bar 不为零,带有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
...但这似乎有点臭,更不用说效率低下(我只在创建时关心的是每次验证都被调用)。
是否有一些更优雅的方法可以在检查验证之前将 bar 默认设置为 0 并且仅在创建时?