2008-11-13 33 views
3

有谁知道Rails中的任何方法可能会冻结关联的对象。我遇到的问题是我的订单模型中有许多订单项,而这些订单项又属于产品或服务。订单付款时,我需要冻结订购商品的详细信息,以便在价格更改时保留订单的总计。冻结关联对象

+0

您能清楚地列出您的模型及其关联吗?它会帮助我想很多。 – mwilliams 2008-11-13 13:07:47

回答

8

我曾经在线购买系统。你想要做的是有一个Order类和一个LineItem类。 LineItems存储产品详细信息,如价格,数量,以及可能需要记录的其他一些信息。它更复杂,但它是我知道锁定细节的唯一方法。

订单仅由LineItems组成,可能包含运费和帐单地址。订单的总价格可以通过将LineItems相加来计算。

基本上,您在购买前冻结数据。当它们被添加到订单中时,数据会被冻结,因为LineItem会重复传送产品信息。通过这种方式,当产品从系统中移除时,您仍然可以理解旧订单。

您可能需要查看一个Rails插件调用'AASM'(以前称为状态机)来处理订单状态。

编辑:AASM可以在这里找到http://github.com/rubyist/aasm/tree/master

+0

实用的RoR书籍是本书前半部分的一个例子。他们也推荐这样做,而且它似乎是锁定购买的最佳方式。 – 2008-11-18 03:39:52

1

不应该当项目添加到订单的价格已经被冻结?假设我把一个小部件放到我的购物篮中,认为它的价格为1美元,并且在我登记时,它会花费5美元,因为您改变了价格。

回到你的问题:我不认为这是一个语言问题,而是一个功能问题。不要将价格与物品相关联,您需要复制价格。如果订单中的每件商品都有自己的价格版本,未来的价格变化不会影响它,您可以添加折扣等。

实际上,为了保持干净,您需要为您的价格添加版本控制。当物品的价格发生变化时,您不会覆盖价格,您可以添加更新的版本。订单中的订单项仍将与旧价格相关联。

3

有几个选项:

1)添加一个版本号模型。在当天的工作我们做课程安排。某个特定课程可能会偶尔更新,但出于商业规则的原因,了解您注册当天的样子很重要。将:version_number添加到型号和find_latest_course(course_id),根据需要修改代码,搅拌一下。在这种情况下,您不会像编辑新的更新版本那样“编辑”模型。 (很显然,你的LineItems有一个item_id和一个item_version_number。)

这个通用模式可以扩展到覆盖,不寒而栗,审计跟踪。

2)将数据复制到LineItem对象LineItem创建时间。仅仅因为你可以在任何东西上挥舞has_a,并不意味着你应该这样做。如果一个'LineItem'应该持有发票上出现的一个项目的固定记录,那么使LineItem持续记录发票上出现的一个项目。然后,您可以随意更新InventoryItem#current_price,而不会影响您先前保存的LineItems

3)如果您懒惰,只需冻结订单对象的价格。并非真正推荐这个,但是,嘿,它在一个捏。尽管如此,你可能只是拖延了一天的推算。

“我6个月前从你那里订购了,现在正在征税,为什么你的书店没有给我看我订购的一半书籍?你是什么意思,当你停止销售它们时,他们的ID被清除了?我需要知道我可以扣除哪些东西!“