【发布时间】:2011-03-27 00:09:49
【问题描述】:
在当前的项目中,我有一个名为 Box 的模型,用于存储来自在线商店的商品。一个盒子属于 Package(它定义了价格、付款条件等),并且有许多 Item 和 ExtraItem 对象,其中包含包含在盒子中的产品和额外优惠。
当客户用产品和额外优惠填充一个盒子并继续结帐时,将创建一个 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
它基本上冻结了关联(一个盒子有许多 items、extraitems 和 garrisons)并重新定义某些方法以在以下情况下引发 LockedBoxError 异常调用。
由于这似乎按预期工作,我真的很担心这种方法会导致意外行为,我正在寻找一种方法来实现相同的效果 不需要重写方法我正在做的事情!
你们知道我可以用什么方法吗?我真的很感谢你的帮助! :)
【问题讨论】:
标签: ruby-on-rails ruby metaprogramming rails-models