3

次のように、「foo」が正常に作成された後に「do_this」を実行し、「do_this」がエラーなしで実行されたときに「do_that」を実行する必要がある状況があります。

class Foo < ActiveRecord::Base

  around_create do |foo, block|
    transaction do
      block.call # invokes foo.save

      do_this!
      do_that!
    end
  end

  protected

  def do_this!
    raise ActiveRecord::Rollback if something_fails
  end

  def do_that!
    raise ActiveRecord::Rollback if something_else_fails
  end

end

また、いずれかが失敗した場合に備えて、トランザクション全体をロールバックする必要があります。

ただし、問題は、「do_this」または「do_that」が失敗した場合でも、「foo」が常に存続することです。何を与える?

4

1 に答える 1

4

これを行う必要はありません。コールバックに false を返すと、ロールバックがトリガーされます。必要なものをコーディングする最も簡単な方法は次のとおりです

after_save :do_this_and_that

def do_this_and_that
  do_this && do_that
end

def do_this
  # just return false here if something fails. this way,
  # it will trigger a rollback since do_this && do_that
  # will be evaluated to false and do_that will not be called
end

def do_that
  # also return false here if something fails to trigger
  # a rollback
end
于 2013-02-19T13:59:51.287 に答える