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

AnA*_*ice 11 ruby-on-rails activemodel ruby-on-rails-3

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

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

after_commit :push_changes
Run Code Online (Sandbox Code Playgroud)

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

Yon*_*oni 27

您可以使用previous_changesafter_commit从保存之前访问模型的属性值.

有关详细信息,请参阅此帖子: 属性的after_commit


Bar*_*aun 8

你可以做几件事来检查......

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

user = User.find(1)
user.name_changed? # => false
user.name = "Bob"
user.name_changed? # => true
Run Code Online (Sandbox Code Playgroud)

但是,您还可以检查整个模型中哪些属性已更改:

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

还有一些你可以做的事情 - 详情请查看http://api.rubyonrails.org/classes/ActiveModel/Dirty.html.

编辑:

但是,鉴于这是在after_commit回调中发生的,模型已经被保存,这意味着在保存之前发生的变化的知识将丢失.您可以尝试使用before_save回调自行选择更改,将它们存储在某处,然后在使用时再次访问它们after_commit.

  • `更改?`/`changes`将在**after_save**中工作,但不能**after_commit**.相反,您可以在**after_commit**中使用`previous_changes` - 请参阅@ Jonathan的[answer](http://stackoverflow.com/a/16823712/165673) (7认同)
  • 对,抱歉,错过了那一部分.保存模型后,更改的属性将被删除,因此这将是无用的...例如,您可以使用`before_save`存储更改的属性,然后再检索它们吗? (3认同)