繁体   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