簡體   English   中英

如何防止對模型進行修改?

[英]How do I prevent modifications to a Model?

在當前項目中,我有一個名為Box的模型,該模型存儲在線商店中的商品。 包裝盒屬於“ Package (定義價格,付款條件等),並具有許多ItemExtraItem對象,用於容納包裝盒中包含的產品和額外優惠。
當客戶用產品和額外優惠填充盒子並進行結帳時,將創建一個類Purchase的新對象,並引用包含其項目的Box

Purchase具有名為total的屬性,該屬性從包含項目的框(在before_validation掛鈎上)獲取總貨幣值,並且即使產品價格發生變化也保留已支付總金額的記錄。 我擔心的是,即使在確認並創建購買后,仍可以更改其所屬的 (可以添加/刪除項目),創建的記錄不能反映購買時的實際情況。

為了防止對box進行更改,我創建了一個方法,該方法掛在after_initialize和initialize方法上,以防止在鎖定屬性設置為true的情況下調用特定的屬性更改方法。 它的工作方式如下:

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

它基本上凍結了關聯(一個盒子包含許多物品額外 物品駐軍 ),並重新定義了某些方法,以在調用時引發LockedBoxError異常。

由於這似乎按預期工作,我真的很擔心這種方法會導致意外的行為,我正在尋找一種方法來實現相同的效果, 無需覆蓋我正在做的方法!

你們知道我有什么辦法嗎? 非常感謝您的幫助! :)

我將使用attr_readonly將您的屬性標記為只讀。 它們將在您創建記錄時創建,但此后將無法更新。

參見http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-c-attr_readonly

您也可以使用readonly!使記錄變為只讀。

可以在這里找到文檔: http : //api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-readonly-21

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM