有没有人知道Rails中可以冻结关联对象的任何方法。我遇到的问题是我有一个包含许多订单项的订单模型,而这些订单项又属于某个产品或服务。支付订单时,我需要冻结订购商品的详细信息,以便在价格更改时保留订单的总数。
答案 0 :(得分:8)
之前我在网上购买系统。你想要做的是有一个Order类和一个LineItem类。 LineItems存储产品详细信息,如价格,数量,以及您需要保留记录的其他一些信息。它更复杂,但这是我知道锁定细节的唯一方法。
订单只是由LineItems组成,可能包含送货地址和帐单地址。可以通过将LineItem相加来计算订单的总价。
基本上,您在购买之前冻结数据。将它们添加到订单后,数据将被冻结,因为LineItems会复制nessacary产品信息。这样,当从系统中删除产品时,您仍然可以理解旧订单。
您可能希望查看rails插件调用'AASM'(以前充当状态机)来处理订单状态。
编辑:AASM可以在这里找到http://github.com/rubyist/aasm/tree/master
答案 1 :(得分: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是什么意思?我需要知道哪些可以扣除!“
答案 2 :(得分:1)
将物品添加到订单时,价格是否已经冻结?假设我把一个小部件放到我的购物篮中,认为它花费1美元,当我在登记册时,因为你改变了价格而花了5美元。
回到你的问题:我不认为这是一个语言问题,而是一个功能问题。您需要复制价格,而不是将价格与商品相关联。如果订单中的每个商品都有自己的价格版本,未来的价格变化不会影响它,您可以添加折扣等。
实际上,为了保持清洁,您需要在价格中添加版本。当商品的价格发生变化时,您不会覆盖价格,而是添加更新的版本。您订单中的订单项仍会与旧价格相关联。