我有一张表,我正在转储一些交易数据。
我有一个交易模型。 在其中,有一个before_save,我在其中通过credit_card网关处理交易,并使用结果填写交易模型中的其余字段。
我有一个Transaction Observer,它会在看到新的交易时发出通知。然后,它尝试使用update_attribute将该尝试的结果保存在TRANSACTION中。
这不足为奇导致一个无限循环,因为观察者正在触发before_save并且我们走了。
有没有办法在不触发before_save回调的情况下更新事务记录中的一个或两个属性?是我将通知结果移到另一个表的唯一解决方案吗?
答案 0 :(得分:2)
您可以使用私有的ActiveRecord方法:
update_without_callbacks
因为它是私人的,所以你需要使用发送
transaction.send(:update_without_callbacks)
答案 1 :(得分:1)
快速且未经测试,但我使用的基本方法是允许回调条件。条件可以是你想要的任何东西。
class ModelWithCallback < ActiveRecord::Base
before_save :update_stuff, :if => :update_needed?
private
def update_stuff
## Your callback code
end
def update_needed?
!(changed.any?{ |field| field == "name" || field == "address")
end
end