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 回答