cwninja的答案应该能解决问题,但还有一点要注意。
首先,基础属性处理是通过write_attribute方法完成的,所以你应该使用它。
Rails也有内置的回调结构可以利用,虽然它不能传递参数,这有点麻烦。
使用自定义回调,你可以这样做:
class Person < ActiveRecord::Base
def write_attribute(attr_name, value)
attribute_changed(attr_name, read_attribute(attr_name), value)
super
end
private
def attribute_changed(attr, old_val, new_val)
logger.info "Attribute Changed: #{attr} from #{old_val} to #{new_val}"
end
end
如果你想尝试使用Rails的回调函数(特别是在有多个回调和/或子类化的情况下很有用),可以像这样做:
class Person < ActiveRecord::Base
define_callbacks :attribute_changed
attribute_changed :notify_of_attribute_change
def write_attribute(attr_name, value)
returning(super) do
@last_changed_attr = attr_name
run_callbacks(:attribute_changed)
end
end
private
def notify_of_attribute_change
attr = @last_changed_attr
old_val, new_val = send("#{attr}_change")
logger.info "Attribute Changed: #{attr} from #{old_val} to #{new_val}"
end
end
after_callbacks
中跟踪模型的更改。 - Jay