gpt4 book ai didi

ruby-on-rails - Rails 3.2 ActiveRecord 事务

转载 作者:行者123 更新时间:2023-12-03 01:52:58 24 4
gpt4 key购买 nike

我一直在读到 ActiveRecord 事务会自动围绕保存和销毁操作进行包装。我的问题涉及以下场景。

我有一个库存系统,可以跟踪发货并在创建发货时调整产品的库存数量。当我删除发货时,我对其进行了编程,然后将发货数量添加回产品的库存数量中。此场景是针对用户弄乱货件的情况而设计的。删除发货后会将发货的商品重新添加到库存中。

我的问题是,当循环product_shipments时,是否有必要提供Product.transaction block ,或者我可以省略它,因为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

最佳答案

为了详细说明 Mischa 的建议,ActiveRecord 回调将允许您以几个重要的方式改进此代码。首先,它删除了促使您写这个问题的丑陋的交易 block 。几乎总是,如果您在 Rails 中看到类似的事务 block ,那么您可能做错了什么。其次,它开始将事情回到他们关心的地方。由于事物位于直观的位置并且很大程度上利用了内置的 Rails 方法,这不仅使维护变得更加容易,而且还使事物更容易测试。

我怀疑没有针对此应用程序的测试。当您正在进行此调整时,这可能是写一些内容的好借口。它开始分解到一些简单的规范可能会大有帮助的程度,并且您的应用程序复杂性看起来可能达到了您可以从增加的想法中受益的程度(特别是由于涉及金钱)。

我将对对象的关系做出某些假设,并将它们排除在下面的示例代码之外,但我想象了一个涉及 Shipments、Products 和 ProductShipments 的 has_many :through 类型情况。

你的 Controller ,已清理:

def destroy
# note: you may not need the additional scope of @shipment - depending on your view, you may be able to omit the @
@shipment = Shipment.destroy(params[:id])
respond_with @shipment, :location => shipments_url
end

您的发货型号:

class Shipment < ActiveRecord::Base

before_destroy :restore_unshipped_inventory

def restore_unshipped_inventory
product_shipments.each(&:restore_unshipped_inventory)
end

end

您的加入模式:

class ProductShipment < ActiveRecord::Base  

def restore_unshipped_inventory
difference = -(s.qty_shipped.to_i)
Product.update_inventory_quantities(difference, product.id)
end

end

老实说,我什至会更进一步,让ProductShipment中的restore_unshipped_inventory对产品实例(product.update_inventory_quantities)进行操作,即使该实例方法所做的只是调用类方法你在那里,只是为了进一步隔离不相关的逻辑。

关于ruby-on-rails - Rails 3.2 ActiveRecord 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12792582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com