1

ここで明らかな何かが欠けているように感じますが、ここにあります。
オブジェクトの属性を格納するローカルデータベースがあります。オブジェクトのインスタンスを更新するときは、リモートAPIも呼び出して、そこでレコードも更新します。そのAPI呼び出しが失敗した場合は、ローカルレコードを以前に保持されていたものにロールバックしたいと思います。これまでのところ、更新する前に現在のレコードのコピーを作成し、そのコピーを使用してAPI呼び出しが失敗した場合にレコードを再更新することしか考えられません。これを行うためのベストプラクティスはありますか?

4

2 に答える 2

1

出来るよ。あなたがそれをしたい方法が何であれ、それはうまくいくでしょう、それについては何も特別なことはありません。

また、リモート更新が失敗した場合、リモートコピーにまだ必要な古い値が含まれている可能性がありますか?リモートコピーを使用してローカルコピーを更新することもできます。その場合も同様です。

于 2012-09-04T00:27:08.133 に答える
1

この場合、データベーストランザクションを使用して、変更を元に戻すことができます。

YourModel.transaction do
  # update model here
  # api call here
  if api_was_successful
    # yay!
  else
    # probably do something here, like notify user
    raise ActiveRecord::Rollback
  end
end

トランザクションブロックに例外があると、データベースの変更がロールバックされます。ActiveRecord :: Rollbackでない限り、例外も再発生します。そのため、API呼び出しで例外が発生する可能性がある場合でも、それらを処理する必要があります(ただし、少なくともモデルの変更はロールバックされます。ブロックに達すると、トランザクションがコミットされます。

参照:http ://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

于 2012-09-04T01:58:18.733 に答える