12

我听说 Rails 有一个脏/更改标志。是否可以在 after_commit 回调中使用它?

在我的用户模型中,我有:

after_commit :push_changes

def push_changes我想知道名称字段是否更改的方法。那可能吗?

4

3 回答 3

33

您可以使用after_commit中的previous_changes来访问模型在保存之前的属性值。

有关更多信息,请参阅此帖子: after_commit 获取属性

于 2013-05-29T21:00:38.493 回答
9

你可以做一些事情来检查......

首先,您可以像这样检查单个属性:

user = User.find(1)
user.name_changed? # => false
user.name = "Bob"
user.name_changed? # => true

但是,您还可以检查整个模型中哪些属性发生了变化:

user = User.find(1)
user.changed     # => []
user.name = "Bob"
user.age = 42
user.changed     # => ['name', 'age']

您还可以做更多的事情 - 查看http://api.rubyonrails.org/classes/ActiveModel/Dirty.html了解详细信息。

编辑:

但是,鉴于这是在after_commit回调中发生的,模型已经被保存,这意味着在保存之前发生的更改的知识丢失了。您可以尝试使用before_save回调来自己挑选更改,将它们存储在某个地方,然后在使用after_commit.

于 2011-08-23T01:17:17.097 回答
2

从 Rails 5.1 开始,after_commit你应该使用saved_change_to_attribute?

参考:Rails 5.1.1 弃用警告 changed_attributes

于 2021-08-16T02:32:37.837 回答