0

我有 2 个模型

  1. ShippingClass,定义运费和运费适用的目的地
  2. 商店,它有一个状态机来确定是否允许一些操作

一家商店有_many shipping_classes。用户可以添加或删除运输类别,除其他因素外,至少存在或不存在一个运输类别这一事实对商店状态有影响。

最重要的是,每当添加/删除/修改运输类时,我都会在商店模型上运行 update_state 方法以使状态保持最新。这个方法所做的基本上是检查有多少 shipping_classes 与商店相关联并相应地调整商店状态(例如,为了简化商店状态,如果分配了至少 1 个 shipping_class,则为活动状态,否则为非活动状态)

我想知道从控制器更新商店状态是否是一种好习惯。事实上,我正在评估让 ShippingClass 在保存和销毁时更新商店的机会。虽然这可能更加防错,因为我不需要记住每次保存 ShippingClass 时都更新 Shop 模型,但是它增加了模型的耦合。

使用回调来执行此操作似乎不是一种选择。这些被包装到事务中。因此,在事务完成之前,父模型(Shop)并不能确切地看到关联模型(ShippingClasses)的状态。

编辑另一个选项,如下所述,是将模型更新放入观察者。这样做的好处是它没有被包装到事务中,因此 Shop 模型应该能够检查关联的 ShippingClasses。缺点是没有包装到事务中,因此更新 Shop 模型失败会使 Shop 状态不同步。然而,这比将更新放入控制器要好,因为它将永远完成一次。

另一个选项可以覆盖 ShippingClass 的 save 和 destroy 方法并从那里更新 Shop 模型。

最佳做法是什么,为什么?

提前致谢

4

1 回答 1

0

正如您所指出的,将逻辑保留在模型中是最好的,因为它会在控制器尝试修改/删除/添加 ShippingClass 的任何时候应用。在模型中,我希望在 ShippingClass 上使用回调 - 让 ShippingClass 更新由于修改/删除/添加操作而受影响的任何商店的状态。

于 2012-07-03T12:39:59.787 回答