2017-07-07 40 views
0

我正在向我的分商家支付款項,並且想知道是否可以使用遞歸來保證在向他們支付款項時,我們將該數據保存到我們的數據庫。是否可以使用遞歸來保證一個對象在Ruby中保存到數據庫?

例子:

def make_payout 
    result = object.process_payout_through_gateway 
    if result.success? 
    payout = Payout.new 
    payout[:paid] = true 
    save_payout(payout) 
    end 
end 

def save_payout(payout) 
    begin 
    payout.save! 
    rescue e 
    save_payout(payout) 
    end 
end 
+0

所以你的「錯誤處理」只是一遍又一遍地重複同樣的事情,直到你得到堆棧溢出? – Alexander

+0

啊,我明白了,那肯定會造成循環。記錄錯誤並從那裏處理會更好,對嗎? – Ctpelnar1988

+0

堆棧級別太深? – Eric

回答

2

如果你想gaunrentee它被保存,而不用驗證對象:

payout.save(validate: false)

-1

謝謝你們,所有偉大的答案。

def save_payout(payout) 
    begin 
    payout.save! 
    rescue e 
    puts "Payment to User-ID: #{current_user.id} FAILED TO SAVE! #{e}" 
    UserMailer.send_payout_failure_email(current_user.id).deliver_now 
    end 
end 

我不會標誌着一個「正確」的答案,只是讓大家贊成票自己喜歡的路線:我親自去了。

+2

從技術上說,我確實回答了你的問題,雖然...驗證錯誤會保存它,無論它是否有效......你並沒有真正給我們提供很多信息離開。你在做什麼實際上並沒有保存記錄...... – Eric

1

簡短的回答是沒有。除非錯誤是暫時的,否則重複執行保存操作不會對您有所幫助,並且在某些情況下甚至可能會加劇問題。

如果你希望某些錯誤常規正常操作過程中發生的,你可以選擇選擇性通過重試處理這些錯誤的操作,例如。這裏的關鍵字是選擇性 - 如果你盲目rescue的一切,即使錯誤是由你不能經常恢復的東西引起的,就像編程錯誤一樣,你仍然有可能重試該操作。因此,你應該總是指定一個特定的異常類,你想rescue

begin 
    payout.save! 
rescue ExceptionThatHappensSometimesButIsNoBigDeal 
    # ignore error + maybe log it, etc. 
end 

捕獲某些異常和重試運行後的交談,非關鍵的外部API時經常使用的一種策略,因爲這些可以有暫時中斷。如果您不忽略這些非關鍵性的例外情況,那麼它們就會冒泡,並將您的應用程序與它們混爲一談。

然而,重試失敗的操作,只有觸摸,你必須控制系統(如保存到本地數據庫)通常是適得其反 - 如果你靜靜地忽略這些錯誤,你可能不及時找出他們。

相關問題