如何在Rails中获取属性的原始值

Leo*_*sov 95 activerecord ruby-on-rails

有没有办法获得ActiveRecord属性的原始值(=从数据库加载的值)?

在观察者中我想要这样的东西

before_save object
  do_something_with object.original_name
end
Run Code Online (Sandbox Code Playgroud)

任务是在更新时从哈希表中删除对象(事实上,将其移动到表中的另一个键).

Vin*_*ent 240

附加_was到您的属性将为您提供以前的值.

  • 例如:对于`self.context`:`self.context_was` (7认同)
  • 可以在http://apidock.com/rails/ActiveModel/Dirty/attribute_was找到该文档 (4认同)
  • 这方面的文件在哪里? (2认同)

Joh*_*ley 8

ActiveRecord的attributes_before_type_cast方法在进行类型转换和反序列化之前返回属性的哈希值.


Luc*_*ade 8

适用于5.1+导轨

_was在rails 5.1中不推荐使用追加,现在你应该追加_before_last_save

就像是:

before_save object
  do_something_with object.name_before_last_save
end
Run Code Online (Sandbox Code Playgroud)

会前最后一次保存在数据库(作品保存和创造)返回名称值


之间的差额_was,并_before_last_save根据文档:

_ 来自docs的来源

def attribute_was(attr)
  attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
end
Run Code Online (Sandbox Code Playgroud)

来自docs的_before_last_save来源

def attribute_before_last_save(attr_name)
  mutations_before_last_save.original_value(attr_name)
end
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到一个更好的例子

  • `attribute_was` 已被弃用,取而代之的是 `attribute_in_database`,而 `attribute_before_last_save` 是从 5.1 开始的全新方法,在早期版本的 Rails 中没有等效方法。来源:https://github.com/rails/rails/pull/25337#issuecomment-225166796 (3认同)

rde*_*an1 5

看看Rails文档

http://api.rubyonrails.org/classes/ActiveModel/Dirty.html

Model.attribute_was返回先前的值:D