2012-04-22 6 views
2

私たちのout_logsコントローラには、レール3.1.3 appの2つのテーブルに保存するためのコードがあります。 2つの節約が完了したかどうかを確認するために、トランザクションが使用されます。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とトランザクションループでレンダリングされますが、これらのredirect_toまたはレンダリングはトランザクションループの実行時間を増加させ、データベースをロックします(私たちはsqlite3を使用します)。

ありがとうございます。

答えて

3

最初にオフ:redirect_toまたはrenderは、returnのように動作しません。彼らは、現在準備中の応答でいくつかのヘッダーを割り当てるだけです。取引について

if @out_log.save && @part.save 

上記のコードは、あなたのDBに一貫性のない状態になるはずです:どのような最初のsaveは成功し、二つ目はないですか?想像するのも難しいです。

解決策は非常に簡単です:save!(最後に感嘆符を付けてください)を使用してください。この方法で検証が失敗した場合、トランザクション全体がロールバックされます(saveのようにが返される代わりにfalseが返されます)。

+0

感謝します。ありがとうございます。 – user938363

関連する問題