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

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

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

before_save object
  do_something_with object.original_name
end

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

Leonid Shevtsov asked 2019-08-12T09:07:50Z
4个解决方案
237 votes

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

Vincent answered 2019-08-12T09:08:03Z
8 votes

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

John Topley answered 2019-08-12T09:08:27Z
7 votes

适用于5.1+导轨

追加_was在rails 5.1中已弃用,现在您应该追加_before_last_save

就像是:

before_save object
  do_something_with object.name_before_last_save
end

将在上次保存数据库之前返回名称值(用于保存和创建)


根据文档,_was_before_last_save之间的差异:

_来自docs的来源

def attribute_was(attr)
  attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
end

来自docs的_before_last_save来源

def attribute_before_last_save(attr_name)
  mutations_before_last_save.original_value(attr_name)
end

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

Lucas Andrade answered 2019-08-12T09:09:37Z
4 votes

看看rails文档

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

Model.attribute_was返回上一个值:D

rderoldan1 answered 2019-08-12T09:10:16Z
translate from https://stackoverflow.com:/questions/1487548/how-to-get-the-original-value-of-an-attribute-in-rails