2012-09-04 73 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

相關問題