在before_update中回滚update_attributes

时间:2015-06-24 13:47:26

标签: ruby-on-rails activerecord model

我有以下型号:

class Model < ActiveRecord::Base
    attr_accessible :foo

    before_update :check_for_stuff

    def check_for_stuff
      # foo_was = 42; foo = 24
      raise ActiveRecord::Rollback if foo_was == 42
    end

    def update_foo
      update_attributes foo: 24
    end
end

将引发异常,但回滚不会发生,该值将设置为24。

如何正确触发整个交易的回滚?

1 个答案:

答案 0 :(得分:0)

如果是foo,你可以重置foo的值。

class Model < ActiveRecord::Base
  attr_accessible :foo

  before_update :check_for_stuff

  def check_for_stuff
    # foo_was = 42; foo = 24
    if foo_was == 42
      reset_attributes(["foo"]) # This resets just foo. Use reset_attributes to wipe all dirty changes.
      raise ActiveRecord::Rollback
    end
  end

  def update_foo
    update_attributes foo: 24
  end
end

有关reset_attributes和ActiveModel :: Dirty接口here的更多信息。