【问题标题】:Rails check if field value is the default value for that fieldRails 检查字段值是否是该字段的默认值
【发布时间】:2016-01-07 15:35:21
【问题描述】:

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

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

【问题讨论】:

  • “但我宁愿与动态值进行比较”——你在这里是什么意思?您还想将其与什么进行比较?
  • 与其检查是否number != 0,我更愿意检查是否number != Address.default_for_number,或类似的东西。

标签: ruby-on-rails activerecord default


【解决方案1】:

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

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

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

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

所以你的before_create 看起来像:

before_create :callback, if: :number_changed?

【讨论】:

  • 看起来很整洁,但是如果我将其更改为一个值,然后返回默认值,我想它不会按预期工作。我会使用一些万无一失的东西。
  • @AndreiHorak 找到了!
  • 另外,如果您将属性设置为非默认值,然后又恢复为默认值,*_changed? 将恢复为报告false
  • 似乎我错过了明显的column_defaults。并且不知道*_changed? 恢复。谢谢!
【解决方案2】:

使用列有什么用?

Address.columns_hash['number'].default 

应该给你想要的

所以可能是这样的

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

但这似乎比使用 number_changed? 之类的东西有点奇怪

【讨论】:

    猜你喜欢
    • 2019-05-04
    • 2016-01-04
    • 2014-02-22
    • 1970-01-01
    • 2017-11-21
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多