2012-09-04 72 views
1

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

+3

为什么不先进行API调用,然后只更新您的记录,如果它成功 – DNJohnson

+0

这就是我在第一次做,但是,如果有本地的情况?第二个API调用远程重新更新记录似乎太不利于用户体验 –

回答

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

+0

Bet!正是我需要的。 –

1

你可以这样做。无论你想做什么,它都可以工作,没有什么特别的。

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

+0

好点,但我认为,如果失败是远程数据库无法访问我会运气不好 –

+0

它可能不会以您想要的方式对用户体验造成不利影响。如果您出于某种原因认为第二次API调用的内容非常密集,那么我猜,如果您认为这是非常密集的,我想将您的API调用卸载到另一个线程,进程,服务器等。 – sajawikio

相关问题