【问题标题】:How do I prevent modifications to a Model?如何防止修改模型?
【发布时间】:2011-03-27 00:09:49
【问题描述】:

在当前的项目中,我有一个名为 Box 的模型,用于存储来自在线商店的商品。一个盒子属于 Package(它定义了价格、付款条件等),并且有许多 ItemExtraItem 对象,其中包含包含在盒子中的产品和额外优惠。
当客户用产品和额外优惠填充一个盒子并继续结帐时,将创建一个 Purchase 类的新对象,并引用包含其项目的 Box

Purchase 有一个名为 total 的属性,它从包含项目的盒子中获取总货币价值(在 before_validation 挂钩上)并记录支付的总金额,即使产品价格发生变化.我担心的是,即使在确认并创建购买后,属于它的 box 仍然可以更改(可以添加/删除项目),创建不反映实际情况的记录购买时间。

为了防止对 box 进行更改,我创建了一个挂钩 after_initialize 和初始化方法的方法,以防止在 locked 属性设置为 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

它基本上冻结了关联(一个盒子有许多 itemsextraitemsgarrisons)并重新定义某些方法以在以下情况下引发 LockedBoxError 异常调用。

由于这似乎按预期工作,我真的很担心这种方法会导致意外行为,我正在寻找一种方法来实现相同的效果 不需要重写方法我正在做的事情!

你们知道我可以用什么方法吗?我真的很感谢你的帮助! :)

【问题讨论】:

    标签: ruby-on-rails ruby metaprogramming rails-models


    【解决方案1】:

    您还可以使用 readonly! 使记录变为只读!

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

    【讨论】:

    • 简单优雅的解决方案!正是我需要的!
    【解决方案2】:

    我会使用 attr_readonly 将您的属性标记为只读。它们将在您制作记录时创建,但之后将无法更新。

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

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      • 2013-12-11
      • 2020-05-07
      • 2011-09-08
      相关资源
      最近更新 更多