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