前提・実現したいこと
bicycle tableのnumberを変更したときに、history tableのbicycle_idを更新処理を書いています。
1 bicycle tableのnumberがすでに存在する場合
numberに該当するidを、bicycle_idとしてhistory tableを更新。
2 bicycle tableのnumberが存在しない場合
bicycle tableに新たに登録、作成されたidを、history tableの該当レコードを更新。
ここで、
2番のbicycle tableに登録後、history tableの更新時にエラーがあった場合、
bicycle tableに登録されたものは、rollbackされるようにするためにどうすればよいでしょうか?
transaction処理を書いているんですが、うまく処理されませんでした。
該当のソースコード
controller
1 def correction 2 logger.info "update start" 3 record = History.find(params[:id]) 4 bicycle = Bicycle.find_by(number: params[:number]) 5 6 # ------- transaction start ------------- 7 ActiveRecord::Base.transaction do 8 9 # number あり 10 if bicycle 11 begin 12 record.update!(bicycle_id: vehicle.id, correction_flg: 1) 13 render json: { status: 200, message: "Success correction" } 14 rescue 15 render status: :internal_server_error 16 end 17 else 18 # number なし 19 logger.info "no result. insert new record." 20 begin 21 bicycle = Bicycle.create!(number: params[:number]) 22 if bicycle 23 record.update!(bicycle_id: bicycle.id, correction_flg: 1) 24 render json: { status: 200, message: "Success correction" } 25 end 26 rescue 27 render status: :internal_server_error 28 end 29 end #if bicycle end 30 end # transaction end 31end # correction
回答1件
あなたの回答
tips
プレビュー