2011-03-27 72 views
0

在當前的項目中,我有一個名爲Box的模型,用於存儲來自在線商店的商品。一個盒子屬於一個Package(它定義了價格,支付條件等),並且有很多ItemExtraItem對象包含產品和包含在盒子中的額外優惠。
當客戶填充包含產品和額外優惠的包裝並繼續結帳時,會創建一個類Purchase的新對象,並參照包含其項目的Box如何防止修改模型?

一個Purchase有一個名爲的屬性,它從包含的項目(在before_validation鉤)box獲得的總貨幣價值,並保持支付,即使產品價格改變總的記錄。我擔心的是,即使購買確認並創建後,屬於它的仍然可以更改(可以添加/刪除項目),創建購買時不反映真實情況的記錄。

爲了防止更改箱子,我已經創建了一個掛鉤after_initialize和初始化方法,以防止如果鎖定屬性設置爲真正被稱爲特定屬性變化的方法的方法。它的工作原理如下:

def trigger_locked_box_behavior 
    if locked? 
    [:items,:extra_items,:garrisons].each { |p| (send("#{p.to_s}")).freeze } 
    [:package=, :package_id=, :box_behavior_type=, :resource=, :resource_id=, :resource_type=].each do |param| 
     class_eval do 
     define_method(param) do |*args| 
      raise LockedBoxError 
     end 
     end 
    end 
    end 
end 

它基本上凍結協會(一個盒子有很多項目extraitems駐軍)並重新定義某些方法調用的時候提出一個LockedBoxError例外。

由於這似乎按預期工作,我真的很擔心,這種方法可能會導致意想不到的行爲,我正在尋找一種方法來實現相同的效果沒有需要重寫方法我的方式,正在做!

你們知道我可以做什麼嗎?我非常感謝你的幫助! :)

回答