2013年11月20日水曜日

Railsで親子関係のモデルのsave時にtransactionをする

こんな関係の時に、トランザクションを使って、どう更新するか?
class User < ActiveRecord::Base
  has_many :projects
end

class Project < ActiveRecord::Base
  belongs_to :user
  #nameというカラムを持っています。
end
バリデーションに引っ掛かった場合は例外をthrow。
DBの更新時にエラーが発生した場合も例外をthrow。
例外の種類によって、メッセージを分けたい場合は、rescueを追加してもいいかもしれません。
  def update
    begin
      @user = User.find(params[:id])
      @user.valid? #validation throw ActiveRecord::RecordInvalid
      Project.transaction do
        @user.update_attributes!(params[:user])
        @user.projects << Project.new(name: "test_name")
      end
      respond_to do |format|
        format.html { redirect_to @user, notice: t("general.success_update") }
      end
    rescue
      respond_to do |format|
        format.html { render action: "edit" }
      end
    end
  end

0 件のコメント: