Rails如何检查某个字段的值是否是该字段的默认值?

9
我有一个名为number的字段在Address模型上,数据库级别上默认值为0。如果我执行Address.new.number,我将得到0
现在,我想仅在number != <default value>时触发before_create回调。因此,我将使用before_create :callback, unless: <condition>。如何使用一些Rails "逻辑"来检查这个条件?我知道可以与0进行比较,但我宁愿与由Rails检索的动态值进行比较。

“但我更愿意与动态值进行比较。”-- 这里你的意思是什么?你还想与什么进行比较? - Wes Foster
与其检查 number != 0,我宁愿检查 number != Address.default_for_number 或类似的内容。 - linkyndy
2个回答

22
默认值以哈希形式存储在Address.column_defaults中,其中键为列名,值为默认值:{"column" => default}
Address.column_defaults
#=> {"number" => 0, "street" => nil, ...}

你也可以使用Rails提供的<属性>_changed?方法。除非你使用非默认值初始化对象,否则该值将为false
Address.new.number_changed? #=> false
Address.new(number: 1).number_changed? #=> true

因此,您的before_create可能如下所示:

before_create :callback, if: :number_changed?

看起来很整洁,但如果我将其更改为一个值,然后再改回默认值,我想它不会按预期工作。我会使用一些防错措施。 - linkyndy
@AndreiHorak 找到了! - Kristján
另外,如果您将属性设置为非默认值,然后再将其设置回默认值,*_changed? 将恢复报告 false - Kristján
看起来我错过了那个显而易见的 column_defaults,并不知道 *_changed? 会回滚。谢谢! - linkyndy

1

使用列有什么问题吗?

Address.columns_hash['number'].default 

我应该给你想要的东西。
所以也许是这样的。
before_create :callback, unless: Proc.new { |address| address.number == Address.columns_hash['number'].default }

但是使用类似于number_changed?这样的方式似乎有点奇怪。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接