我听说rails有脏/改变标志。是否可以在after_commit回调中使用它?
在我的用户模型中,我有:
after_commit :push_changes
在def push_changes
我希望知道名称字段是否发生变化。这可能吗?
答案 0 :(得分:25)
您可以使用 after_commit 中的previous_changes来访问模型保存之前的属性值。
请参阅此帖子了解更多信息: after_commit for an attribute
答案 1 :(得分:8)
你可以做一些事情来检查......
首先,您可以检查单个属性:
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
时再次访问它们。