我有一个保存后的回调:
after_save :do_an_expensive_task_on_basis_of_flag_value
我后来意识到这是一项非常昂贵的任务,当没有设置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,只有在创建时设置了Flag并且在更新时使用:after_save
更新了标记时才会调用此任务。
注意:这不是正确的方法:
after_save :do_an_expensive_task_on_basis_of_flag_value , :if => Proc.new {|a| a.flag.present? or a.flag_changed?}
因为它仍会在更新时调用回调,即使标志未更改。
答案 0 :(得分:4)
a.flag_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 :(得分:3)
你的过程中的逻辑有些错误。如果标志存在,它将始终运行,无论是否已在此保存中更改。
当然a.flag_changed?
对你需要的逻辑来说已经足够了吗?如果添加了该标志,它将从(其默认值,可能是nil)更改为(无论您将其设置为)。