Rails 检查字段值是否为该字段的默认值

Rails check if field value is the default value for that field

我在 Address 模型上有一个名为 number 的字段,它在数据库级别设置了默认值 0。如果我这样做 Address.new.number,我会得到 0

现在,我只想在 number != <default value> 时触发 before_create 回调。所以,我会有before_create :callback, unless: <condition>。我如何使用一些 Rails "logic" 来检查这个?我知道我可以与 0 进行比较,但我更愿意与 Rails.

检索到的动态值进行比较

默认值可在 Address.column_defaults 中作为 {"column" => default} 的散列访问:

Address.column_defaults
#=> {"number" => 0, "street" => nil, ...}

您还可以使用 Rails 提供的 <attribute>_changed? 方法。这将是 false,除非您使用 non-default 值初始化对象。

Address.new.number_changed? #=> false
Address.new(number: 1).number_changed? #=> true

所以你的 before_create 可以看起来像:

before_create :callback, if: :number_changed?

使用这些列怎么样?

Address.columns_hash['number'].default 

应该给你想要的

所以也许是这样的

before_create :callback, unless: Proc.new { |address| address.number == Address.columns_hash['number'].default }

但这似乎比使用 number_changed?

这样的东西有点奇怪