私は、ActiveRecord トランザクションが保存および破棄アクションを自動的にラップしていることを読んでいます。私の質問は、次のシナリオに関連しています。
出荷を追跡し、出荷が作成されたときに製品の在庫量を調整する在庫システムがあります。出荷を削除すると、出荷数量が製品の在庫量に追加されるようにプログラムされています。このシナリオは、ユーザーが貨物を汚した場合のために設計されています。出荷を削除すると、出荷されたアイテムが在庫に追加されます。
私の質問は、product_shipments がループされるとき、Product.transaction ブロックを提供する必要があるか、または destroy メソッドが自動的にトランザクションにラップされるため、これを省略できますか? 私のようにループ全体をトランザクションでラップしても大丈夫ですか? 何か問題が発生した場合に、これらすべてのデータベース操作がロールバックされるようにするにはどうすればよいでしょうか?
def destroy
@shipment = Shipment.find(params[:id])
@shipments = @shipment.product_shipments
Product.transaction do
@shipments.each do |s|
@difference = -(s.qty_shipped.to_i)
Product.update_inventory_quantities(@difference, s.product_id)
end
end
@shipment.destroy
respond_with @shipment, :location => shipments_url
end