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


96

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

我想要观察员这样的事情

before_save object
  do_something_with object.original_name
end

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

Answers:


243

在Rails 5.1之前

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

用于导轨5.1+

摘录自卢卡斯·安德拉德(Lucas Andrade)的以下回答https : //stackoverflow.com/a/50973808/9359123


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

就像是:

before_save object
  do_something_with object.name_before_last_save
end

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


_was并且_before_last_save根据文档之间的区别:

_was从文档

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

_before_last_save 来自文档的来源

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

7
例如:为self.contextself.context_was
Freedom_Ben

2
该文件在哪里?
j将


在文档中,没有的“弃用”警告_was
Rael Gugelmin Cunha

11

用于导轨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根据文档之间的区别:

_was从文档

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

_before_last_save 来自文档的来源

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

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


1
attribute_was不推荐使用attribute_in_database,而推荐使用,而attribute_before_last_save从5.1开始,这是一种全新的方法,在早期版本的Rails中没有等效方法。来源:github.com/rails/rails/pull/25337#issuecomment-225166796
ohaleck


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.