有谁知道Rails中的任何方法可能会冻结关联的对象。我遇到的问题是我的订单模型中有许多订单项,而这些订单项又属于产品或服务。订单付款时,我需要冻结订购商品的详细信息,以便在价格更改时保留订单的总计。冻结关联对象
冻结关联对象
回答
我曾经在线购买系统。你想要做的是有一个Order类和一个LineItem类。 LineItems存储产品详细信息,如价格,数量,以及可能需要记录的其他一些信息。它更复杂,但它是我知道锁定细节的唯一方法。
订单仅由LineItems组成,可能包含运费和帐单地址。订单的总价格可以通过将LineItems相加来计算。
基本上,您在购买前冻结数据。当它们被添加到订单中时,数据会被冻结,因为LineItem会重复传送产品信息。通过这种方式,当产品从系统中移除时,您仍然可以理解旧订单。
您可能需要查看一个Rails插件调用'AASM'(以前称为状态机)来处理订单状态。
编辑:AASM可以在这里找到http://github.com/rubyist/aasm/tree/master
实用的RoR书籍是本书前半部分的一个例子。他们也推荐这样做,而且它似乎是锁定购买的最佳方式。 – 2008-11-18 03:39:52
不应该当项目添加到订单的价格已经被冻结?假设我把一个小部件放到我的购物篮中,认为它的价格为1美元,并且在我登记时,它会花费5美元,因为您改变了价格。
回到你的问题:我不认为这是一个语言问题,而是一个功能问题。不要将价格与物品相关联,您需要复制价格。如果订单中的每件商品都有自己的价格版本,未来的价格变化不会影响它,您可以添加折扣等。
实际上,为了保持干净,您需要为您的价格添加版本控制。当物品的价格发生变化时,您不会覆盖价格,您可以添加更新的版本。订单中的订单项仍将与旧价格相关联。
有几个选项:
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被清除了?我需要知道我可以扣除哪些东西!“
- 1. 如何解冻/解冻Javascript中的冻结对象?
- 2. JQuery对话框冻结关闭
- 3. 冻结对象中的记忆方法
- 4. Object.freeze不会冻结对象数组
- 5. Javascript:对象不支持方法'冻结'
- 6. iOS 8冻结在更新UserDefaults对象
- 7. Objective C什么是冻结对象
- 8. 构建不冻结的javascript对象
- 9. 对象C运行时关联对象
- 10. 观察对象和关联对象
- 11. 在CakePHP中关联对象
- 12. Objective C关联对象
- 13. 显示关联对象
- 14. 验证对象的关联
- 15. ORM - 创建关联对象
- 16. 验证关联对象
- 17. SQLAlchemy删除关联对象
- 18. 查看关联对象
- 19. ko.utils.arrayMap与关联JSON对象
- 20. 遍历关联对象
- 21. php关联对象数组
- 22. 创建关联对象
- 23. 从冻结父对象创建新对象
- 24. SQLAlchemy的级联和关联对象
- 25. 与HttpSession关联的可关闭对象
- 26. Aptana Studio 3冻结关闭
- 27. 关联对象关联对象失败并且没有方法addX
- 28. 许多一对多与关联对象
- 29. 对象关联:哪个对象应该引用其他对象?
- 30. 如何获得Doctrine2结果对象作为关联数组?
您能清楚地列出您的模型及其关联吗?它会帮助我想很多。 – mwilliams 2008-11-13 13:07:47