0

私のコントローラーアクションの1つは次のようなものです

def create
 App.transaction do
  app = App.create_new_app(params["app_alias"])
  campaign = Campaign.create_new_campaign(params)
  user = User.create_new_user(params)
 end
end

This documentationは、「トランザクションは単一のデータベース接続で動作する」および「完全に分散されたトランザクションはActive Recordの範囲を超えている」と述べています。ユーザーまたはキャンペーンの作成に例外がある場合、アプリもロールバックされるようなものを作成するにはどうすればよいですかおよびその逆?

4

1 に答える 1

4

リンク先の同じドキュメントによると、さまざまなクラスのトランザクションをネストすることにより、分散トランザクションの効果を作成できます。

Student.transaction do
  Course.transaction do
    course.enroll(student)
    student.units += course.units
  end
end

これは洗練されていない回避策として説明されていますが、ここで提案されている他の方法も同様である可能性があります。

もちろん、これを行う必要があるのは、各クラスが異なるデータベースに保存されている場合のみです。すべてのモデルが同じデータベースにある場合、単一の.transactionブロックで目的の効果が得られます。いずれかの部分で障害が発生すると、すべての変更がロールバックされます。 .

于 2013-09-19T07:52:11.470 に答える