【发布时间】:2009-12-15 00:53:53
【问题描述】:
在我的rails 模型中,我有一个名为employer_wcb 的小数属性。如果在更改雇主 wcb 时将脏位设置为 true,我希望它。我想覆盖employer_wcb setter 方法。有什么办法(特别是使用元编程)?
【问题讨论】:
标签: ruby-on-rails ruby metaprogramming alias-method
在我的rails 模型中,我有一个名为employer_wcb 的小数属性。如果在更改雇主 wcb 时将脏位设置为 true,我希望它。我想覆盖employer_wcb setter 方法。有什么办法(特别是使用元编程)?
【问题讨论】:
标签: ruby-on-rails ruby metaprogramming alias-method
实际上,从 Rails v2.1 开始,这已被融入到 Rails 中。看看documentation for ActiveRecord::Dirty。总结:
# Create a new Thing model instance;
# Dirty bit should be unset...
t = Thing.new
t.changed? # => false
t.employer_wcb_changed? # => false
# Now set the attribute and note the dirty bits.
t.employer_wcb = 0.525
t.changed? # => true
t.employer_wcb_changed? # => true
t.id_changed? # => false
# The dirty bit goes away when you save changes.
t.save
t.changed? # => false
t.employer_wcb_changed? # => false
【讨论】:
如果您不想使用 rail 内置的脏位功能(比如说您出于其他原因想要覆盖),则不能使用别名方法(请参阅上面史蒂夫条目中的我的 cmets)。但是,您可以使用对 super 的调用来使其工作。
def employer_wcb=(val)
# Set the dirty bit to true
dirty = true
super val
end
这很好用。
【讨论】: