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?
这样的东西有点奇怪
我在 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?