Dirty

跟踪对象的变化情况。其实,它们都属于脏数据,所以起这名字。但有时候很有用,例如某个字段一经生成不允许更改,或者某字段每次更改要确保与上次不同。

使用 ActiveModel::Dirty,需要:

  • include ActiveModel::Dirty

  • 调用 define_attribute_methods 参数是你想跟踪的属性

  • 在改变属性的值之前,调用 attr_name_will_change! (把 attr_name 换成真正的属性名)

  • 在改变属性的值之后,调用 changes_applied

举例:

class Person
  include ActiveModel::Dirty

  define_attribute_methods :name

  def name
    @name
  end

  def name=(val)
    name_will_change! unless val == @name
    @name = val
  end

  def save
    # do persistence work
    changes_applied
  end

  def reload!
    # reset_changes
  end
end

运用 Attribute Methods 生成的方法,能精确跟踪到某属性:

下面是对它们的解释

除上述方法外,还有

Active Record 也有同名模块,它只是对这里的 Dirty 的封装,并且它并没有对外提供 API.

最后更新于

这有帮助吗?