我听说 Rails 有一个脏/更改标志。是否可以在 after_commit 回调中使用它?
在我的用户模型中,我有:
after_commit :push_changes
在def push_changes
我想知道名称字段是否更改的方法。那可能吗?
我听说 Rails 有一个脏/更改标志。是否可以在 after_commit 回调中使用它?
在我的用户模型中,我有:
after_commit :push_changes
在def push_changes
我想知道名称字段是否更改的方法。那可能吗?
您可以使用after_commit中的previous_changes来访问模型在保存之前的属性值。
有关更多信息,请参阅此帖子: after_commit 获取属性
你可以做一些事情来检查......
首先,您可以像这样检查单个属性:
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
.
从 Rails 5.1 开始,after_commit
你应该使用saved_change_to_attribute?