【发布时间】:2009-09-28 15:03:20
【问题描述】:
有没有办法获取 ActiveRecord 属性的原始值(=从数据库加载的值)?
我想在观察者身上看到这样的东西
before_save object
do_something_with object.original_name
end
任务是在更新时从哈希表中删除对象(实际上是将其移动到表中的另一个键)。
【问题讨论】:
标签: ruby-on-rails activerecord
有没有办法获取 ActiveRecord 属性的原始值(=从数据库加载的值)?
我想在观察者身上看到这样的东西
before_save object
do_something_with object.original_name
end
任务是在更新时从哈希表中删除对象(实际上是将其移动到表中的另一个键)。
【问题讨论】:
标签: ruby-on-rails activerecord
将_was 附加到您的属性将为您提供之前的值。
复制自 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来源from docs
def attribute_was(attr)
attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
end
_before_last_save来源from docs
def attribute_before_last_save(attr_name)
mutations_before_last_save.original_value(attr_name)
end
【讨论】:
self.context:self.context_was
_was 没有“弃用”警告。
附加 _was 在 Rails 5.1 中已弃用,现在您应该附加 _before_last_save
类似:
before_save object
do_something_with object.name_before_last_save
end
将在您上次保存到数据库之前返回名称值(适用于保存和创建)_was和_before_last_save的区别根据文档:
_was来源from docs
def attribute_was(attr)
attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
end
_before_last_save来源from docs
def attribute_before_last_save(attr_name)
mutations_before_last_save.original_value(attr_name)
end
你可以看到一个更好的例子here
【讨论】:
attribute_was 已被attribute_in_database 弃用,而attribute_before_last_save 是从5.1 开始的全新方法,在早期版本的Rails 中没有等效方法。来源:github.com/rails/rails/pull/25337#issuecomment-225166796
ActiveRecord 的 attributes_before_type_cast 方法在类型转换和反序列化发生之前返回属性的哈希值。
【讨论】:
【讨论】: