撤消记录更新的最佳方法是什么?

时间:2012-09-04 00:23:16

标签: ruby-on-rails activerecord

我觉得我在这里遗漏了一些明显的东西,但现在就这样了 我有本地数据库,存储对象的属性。当我更新对象的实例时,我也会调用远程API并在那里更新记录。如果该API调用不成功,我想将我的本地记录回滚到以前保存的任何内容。到目前为止,我唯一想到的就是在更新之前制作当前记录的副本,并在我的API调用失败时使用该副本重新更新记录。这样做有最好的做法吗?

2 个答案:

答案 0 :(得分:1)

你可以做到这一点。无论你想做什么,它都会奏效,没有什么特别之处。

此外,如果远程更新失败,您的远程副本是否仍包含您仍需要的旧值?在这种情况下,您也可以使用远程副本来更新本地副本。

答案 1 :(得分: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