Rails的哪一部分应该负责更新链式模型状态?

时间:2012-07-03 03:34:19

标签: ruby-on-rails ruby-on-rails-3 state-machine

我有2个模特

  1. ShippingClass,定义运费和运费适用的目的地
  2. Shop,其中包含一个状态机,用于确定是否允许执行多项操作
  3. 一家商店有很多shipping_classes。用户可以添加或删除运输类,以及其他因素,至少存在一个shipping_class对商店状态有影响。

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

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

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

    EDIT 如下所述,另一个选择是将模型更新放入观察者。这样做的好处是它不会被包装到事务中,因此Shop模型应该能够检查相关的ShippingClasses。缺点是未包含在事务中,因此更新Shop模型失败将导致Shop状态不同步。然而,这比将更新放入控制器更好,因为它将永远执行一次。

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

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

    提前谢谢

1 个答案:

答案 0 :(得分:0)

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