2012-07-03 41 views
0

我有2種型號Rails的哪一部分應該照顧更新鏈接模型狀態?

  1. ShippingClass,它定義了一個運輸票價和目的地到航運票價適用
  2. 店,其中有一個狀態機,確定了一系列行動,允許與否

一家店has_many shipping_classes。用戶可以添加或刪除貨運類,以及其他因素,至少有一個shipping_class存在或不存在對商店狀態有影響的事實。

底線是,任何時候航運類被添加/刪除/修改我在商店模型上運行update_state方法來保持狀態是最新的。這種方法基本上檢查有多少shipping_classes與商店相關聯並相應地調整商店狀態(例如,如果至少有一個shipping_class被分配,則簡化商店狀態是活動的,否則是不活動的)

我是想知道從控制器更新店鋪狀態是否是好的做法。實際上,我正在評估讓ShippingClass在保存和銷燬時更新商店的機會。雖然這可能更具有錯誤性,但我不需要記住每次保存ShippingClass時更新Shop模型,但它會增加模型的耦合度。

使用回調來做到這一點似乎不是一種選擇。這些被封裝到事務中。 因此,在交易完成之前,父模型(Shop)並沒有完全看到關聯模型(ShippingClasses)的狀態。

編輯 另一種選擇,如下所述,是將模型更新放入觀察者。這樣做的好處是它不包含在交易中,所以Shop模型應該能夠檢查相關的ShippingClasses。缺點是沒有包裝到事務中,所以如果更新商店模型失敗將會使商店狀態異步。然而,這會比將更新放入控制器更好,因爲它將永久完成一次。

另一個選項可以覆蓋ShippingClass的保存和銷燬方法,並從那裏更新商店模型。

什麼是最佳實踐,爲什麼?

在此先感謝

+0

你知道嗎http://api.rubyonrails.org/classes/ActiveRecord/Observer.html –

回答

0

正如你指出的,保持模型的邏輯是最好的,因爲它會再申請一個控制器試圖修改/刪除/添加ShippingClass任何時間。在模型中,我會考慮在ShippingClass上使用回調 - 讓ShippingClass更新由於修改/刪除/添加操作而受到影響的任何商店的狀態。