2012-04-22 28 views
2

我們在我們的out_logs控制器中有以下代碼,用於在rails 3.1.3應用程序中保存到兩個表中。爲了確保兩次節省完成或沒有完成,使用交易。在rails 3.1.3中交易的代碼是否良好和最優?

@out_log.transaction do 
    if @out_log.save && @part.save 
     redirect_to part_path(@part), :notice => "Saved!" 
    else 
     flash.now[:error] = "Not saved!" 
     render 'new' 
    end 
    end 

該代碼似乎工作。我們的問題是:

  1. 上面的代碼是否是交易的良好實踐?
  2. 在事務循環中有redirect_to和render,這些redirect_to或render會增加事務循環的執行時間,因此會鎖定數據庫太久(我們使用sqlite3)?

非常感謝。

回答

3

首先:redirect_torender不會像return聲明那樣行事。他們只是在正在準備的響應中分配一些標題。

關於交易:

if @out_log.save && @part.save 

上面的代碼肯定會導致不一致的狀態在您的數據庫:如果第一save是成功的,第二個是不是?甚至很難想象。

解決方案很簡單:使用save!(感嘆號結尾)。這樣,如果您的驗證失敗,您的整個交易將回滾(例外情況將由save!提出,而不是像save那樣返回false)。

+0

合理,謝謝。 – user938363 2012-04-22 13:54:02