我有以下型号:
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。
如何正确触发整个交易的回滚?
答案 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的更多信息。