Rails:在不触发before_save的情况下添加数据

时间:2009-09-24 06:55:06

标签: ruby-on-rails

我有一张表,我正在转储一些交易数据。

我有一个交易模型。 在其中,有一个before_save,我在其中通过credit_card网关处理交易,并使用结果填写交易模型中的其余字段。

我有一个Transaction Observer,它会在看到新的交易时发出通知。然后,它尝试使用update_attribute将该尝试的结果保存在TRANSACTION中。

这不足为奇导致一个无限循环,因为观察者正在触发before_save并且我们走了。

有没有办法在不触发before_save回调的情况下更新事务记录中的一个或两个属性?是我将通知结果移到另一个表的唯一解决方案吗?

2 个答案:

答案 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