在當前的項目中,我有一個名爲Box
的模型,用於存儲來自在線商店的商品。一個盒子屬於一個Package
(它定義了價格,支付條件等),並且有很多Item
和ExtraItem
對象包含產品和包含在盒子中的額外優惠。
當客戶填充包含產品和額外優惠的包裝並繼續結帳時,會創建一個類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例外。
由於這似乎按預期工作,我真的很擔心,這種方法可能會導致意想不到的行爲,我正在尋找一種方法來實現相同的效果沒有需要重寫方法我的方式,正在做!
你們知道我可以做什麼嗎?我非常感謝你的幫助! :)
簡單和優雅的解決方案!正是我需要的! – 2011-03-27 16:22:35