Ruby on rails Rails 3.2仅在更新或添加属性后才进行保存回调

Ruby on rails Rails 3.2仅在更新或添加属性后才进行保存回调,ruby-on-rails,rails-activerecord,Ruby On Rails,Rails Activerecord,我有一个保存后回调: 保存后:根据标志值执行昂贵任务 后来我意识到这是一项非常昂贵的任务,当flag的值未设置(在创建时)或flag的值未在更新时更新时调用它是没有意义的 因此,我可以做的一件事是将其替换为: after_create :do_an_expensive_task_on_basis_of_flag_value , :if => Proc.new {|a| a.flag.present?} after_update :do_an_expensive_task_on_basis_

我有一个保存后回调:

保存后:根据标志值执行昂贵任务

后来我意识到这是一项非常昂贵的任务,当flag的值未设置(在创建时)或flag的值未在更新时更新时调用它是没有意义的

因此,我可以做的一件事是将其替换为:

after_create :do_an_expensive_task_on_basis_of_flag_value , :if => Proc.new {|a| a.flag.present?}
after_update :do_an_expensive_task_on_basis_of_flag_value , :if => Proc.new {|a| a.flag_changed?}
但是我正在寻找一个单行程序,它有一个proc,只有当在create上设置Flag并且在更新时使用
:after_save
更新Flag时,才会调用此任务

注意:这不是正确的方法:

after_save :do_an_expensive_task_on_basis_of_flag_value , :if => Proc.new {|a| a.flag.present? or a.flag_changed?}

因为它仍然在更新时调用回调,即使标记没有更改。

进程中的逻辑稍有错误。如果该标志存在,则它将始终运行,无论该标志是否在此保存时被更改


当然
a.flag\u已更改?
是否足以满足您所需的逻辑?如果添加了标志,它将从(其默认值,可能为零)更改为(无论您将其设置为什么)。

a.flag\u changed?
适用于这两种情况。但就你的知识而言,你可以这样做:

after_save :do_an_expensive_task_on_basis_of_flag_value , :if => Proc.new {|a| (new_record? and a.flag.present?) or a.flag_changed?}

1) 是的,我甚至说我的逻辑不正确,但我需要在这些行上做点什么2)我想你是对的(a.flag_改变了?应该足够了),让我来测试一下谢谢,同意,这也行。我不知道新唱片?谢谢