Activerecord回调,previous_changes与更改

时间:2017-07-10 15:54:06

标签: ruby-on-rails-4 activerecord callback

我试图了解这两种方法之间的区别是什么。以下是每个文档:

https://apidock.com/rails/v4.2.7/ActiveModel/Dirty/previous_changes

https://apidock.com/rails/v4.2.7/ActiveModel/Dirty/changes

在阅读本文档后,我认为previous_changes是更改完成后更改的内容,这意味着在after_*过滤器中,而changes是将要更改的内容,这意味着它在before_*过滤器中很有用。

我误解了这个吗?

1 个答案:

答案 0 :(得分:8)

是的,你理解正确

这些是脏对象方法

changes用于了解尝试保存对象时发生的更改 previous_changes用于了解保存对象所反映的更改。

但是如果您尝试重新加载对象,changesprevious_changes将返回空哈希{},因为从数据库中提取了新的记录副本

例如用户(id:1,姓名:'Nimish',年龄:24,电子邮件:'test@example.com')

user = User.find(1)
user.changes #Will output => {}
user.previous_changes #Will output => {}
user.name = 'Test User'
user.changes #Will output => {name: ['Nimish', 'Test User']}
user.previous_changes #Will output => {}
user.save
user.changes #Will output => {}
user.previous_changes #Will output => {name: ['Nimish', 'Test User']}
user.reload
user.changes #Will output => {}
user.previous_changes #Will output => {}