如果更新记录的属性,我想更新相应的计数器。如果新值等于旧值,甚至应该发生这种情况。
car.model = 'Fiesta'
car.model = 'Roadstar'
car.model_changed? # => true
car.model = 'Fiesta'
car.model_changed? # => false
是否可以为单个模型设置ActiveRecord以更新“已更改?”属性(甚至数据库)如果旧值等于新值?
答案 0 :(得分:1)
查看ActiveModel::Dirty和ActiveRecord::AttributeMethods::Dirty中的方法。
设置属性时,会调用write_attribute
,Rails会决定changed_attributes
列表会发生什么。管理它的代码最近发生了变化,但在Rails 4.2中我们有:
def save_changed_attribute(attr, old_value)
if attribute_changed_by_setter?(attr)
clear_attribute_changes(attr) unless _field_changed?(attr, old_value)
else
set_attribute_was(attr, old_value) if _field_changed?(attr, old_value)
end
end
这是在将属性设置回其旧值时清除changed_attributes
列表中的属性的内容。您可以在模型中覆盖它,以便将每个属性集记录到changed_attributes
列表中:
# In your Car model
def save_changed_attribute(attr, old_value)
set_attribute_was(attr, old_value)
end