我一直在阅读 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