导轨,使用脏或改变?用after_commit标记

时间:2011-08-23 01:11:44

标签: ruby-on-rails ruby-on-rails-3 activemodel

我听说rails有脏/改变标志。是否可以在after_commit回调中使用它?

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

after_commit :push_changes

def push_changes我希望知道名称字段是否发生变化。这可能吗?

2 个答案:

答案 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时再次访问它们。