【问题标题】:What's the correct way to set default values for a model at creation?在创建时为模型设置默认值的正确方法是什么?
【发布时间】:2013-05-29 21:45:33
【问题描述】:

我应该如何设置我的模型,以便在创建记录时设置给定字段的默认值并且我可以在该字段上运行验证?

例如,假设我有一个字段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 检查验证并仅 创建时?

【问题讨论】:

  • 我不会说它非常低效。该方法提前退出。我猜你的代码在Foo#save 上花费的时间与其他工作相比可以忽略不计。我会保持原样(因为我不知道更好的方法)。

标签: ruby-on-rails validation default


【解决方案1】:

有before_validation :defaults, :on => :create,它只在创建时被调用。

【讨论】:

  • 啊,谢谢!我没有意识到 before_validation 有一个 :on => 选项。
猜你喜欢
  • 2016-11-19
  • 2013-09-06
  • 1970-01-01
  • 2023-03-11
  • 2013-06-03
  • 2015-03-05
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
相关资源
最近更新 更多