3

複数のテーブルに複数のレコードを保存するフォームが送信された後、いくつかの処理を行う必要があります。オール オア ナッシングにする必要があるため、トランザクション ブロックでラップしました。ブロックは問題なく動作しているようですが、トランザクションが成功したかどうかを確認する方法がわからないため、適切な応答を返すことができます。

    ...

      # Start a transaction block so we can back out if anything fails
      ActiveRecord::Base.transaction do

        # Journal Entry for from_account
        gle = from_account.gl_journal_entries.create(....)

        # Journal Line (x2)
        gle.gl_journal_lines.create(....)
        gle.gl_journal_lines.create(....)


        # Journal Entry for to_account
        gle = to_account.gl_journal_entries.create(....)

        # Journal Line (x2)
        gle.gl_journal_lines.create(....)
        gle.gl_journal_lines.create(....)

      end

      # return something based on success/failure of transaction

    ...
4

1 に答える 1

5

1 つのオプションは、スローされているかどうかを示すエラーをキャッチすることです。この場合:

def my_method

  ...

  ActiveRecord::Base.transaction do
    # Journal Entry for from_account
    gle = from_account.gl_journal_entries.create!(....)

    # Journal Line (x2)
    gle.gl_journal_lines.create!(....)
    gle.gl_journal_lines.create!(....)


    # Journal Entry for to_account
    gle = to_account.gl_journal_entries.create!(....)

    # Journal Line (x2)
    gle.gl_journal_lines.create!(....)
    gle.gl_journal_lines.create!(....)
  end

  # this code will only get executed if the transaction succeeds

rescue Exception => ex

  # this code will only get executed if the transaction fails

end

編集:何か問題が発生した場合にエラーがスローされるため、このインスタンスではcreate!代わりに使用することをお勧めします。create

于 2013-10-30T18:19:12.510 に答える