更新ActiveRecord :: Dirty已更改?即使新值等于旧值

时间:2015-03-25 16:28:06

标签: ruby-on-rails activerecord

如果更新记录的属性,我想更新相应的计数器。如果新值等于旧值,甚至应该发生这种情况。

car.model = 'Fiesta'

car.model = 'Roadstar'
car.model_changed? # => true

car.model = 'Fiesta'
car.model_changed? # => false

是否可以为单个模型设置ActiveRecord以更新“已更改?”属性(甚至数据库)如果旧值等于新值?

1 个答案:

答案 0 :(得分:1)

查看ActiveModel::DirtyActiveRecord::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