2013-10-20 30 views
0

在我的命令的控制器,我正在做一個改變到另一個對象,更新訂單的屬性之前,像事務在控制器更新操作中何時開始?

def update 
    @order.organisation.something = @order.something 
    @order.organisation.save! 

    if @order.update_attributes(params[:order]) 
    redirect_to @order 
    else 
    render :edit 
    end 
end 

原因是我需要的順序的前值(這裏所說的「事」)來更新組織在訂單收到新值之前組織

我認爲,當update_attributes由於無效屬性而出現故障時,組織的更改也會回滾,顯然情況並非如此。所以我的問題是:爲什麼這個變化不是「隱式」交易的一部分?我怎樣才能讓它成爲它的一部分?

+0

你爲什麼儲蓄@ order.organisation?只需使用\ @ order.organisation.something = \ @ order.something和rails將在保存@order後自動保存組織。 – Kuldeep

+0

我必須說我沒有意識到這一點......(在軌道上很新)任何建議閱讀這個?我想(讀)控制器啓動了一個隱式事務,它涵蓋了所有數據庫更改。不對? – Danny

+0

是由於「自動保存關聯」? – Danny

回答

0

我假設你來自java並且廣泛使用事務來管理服務器端的狀態。

導軌在這方面有很大的不同。它只在更新數據時才運行事務。因此撥打createsaveupdate_attributes將是單個事務,並且如果要分組語句,則必須自己處理事務。

我曾經創建了a gem called active_service來幫助實現這個功能,但我認爲這只是爲了通用的rails編程而臃腫。但是,它顯示瞭如何使用rails自己處理事務。

實際上很簡單,你只需撥打transaction每個ActiveRecord類:

User.transaction { [your transactional code here] } 
+0

我開始閱讀這篇文章,總而言之,我明白保存或創建會啓動一個事務,所以在該事務中處理來自該保存或創建的回調中的所有對象修改。如果我需要更多,我必須自己明確地開始交易。好的總結? – Danny

+0

總結得很好。 – phoet

相關問題