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