【问题标题】:Rails 4 - Creating bills about products I have listedRails 4 - 为我列出的产品创建账单
【发布时间】:2016-04-07 09:12:12
【问题描述】:

我有一个模型Product,关于我在我的商店提供的所有产品这基本上只是name:stringprice:decimal

另一方面,我有一个模型Bill,我列出了Products 的销售量。我想在 Bills 和 Products 之间建立 M:N 关系,这样Bill 可以销售许多产品,Product 可以在不同的 Bills 中销售。

但会出现以下问题:如果我在几年后更改产品价格怎么办?如果我尝试查看过去签发的账单,我会得到错误的金额。

解决这个问题的最佳方法是什么?

【问题讨论】:

  • 为什么不把产品的当前价格也保存在账单上呢?例如,在 JSON 中,您可以在账单上有多个产品,其当前价格与几年后产品的价格无关。或者添加第三个关系,例如您拥有产品、购买价格和账单 ID 的交易。那么 Bill 会有多个 Transactions 并且 Product 的价格是否改变都没有关系。
  • 与第三个关系,没有。您还可以将产品金额添加到交易中。然后您只需查询Transaction.where("product_id = yourid and created_at between X and Y").sum(:productamount) 等。应该很容易。我认为如果您打算更改产品并希望记录账单上的更改+有其他数据(例如金额和价格),则需要使用第三关系,否则会太混乱和复杂

标签: ruby-on-rails database-relations


【解决方案1】:

你可以添加第 3 个关系到这个,不要让它像我在评论中发布的那样复杂。

例如,我们称之为Transaction

  • 产品 has_many Transactions
  • Bill has_many Transactions
  • 交易 has_one 账单,产品

Transaction 的内容类似于 product_id:integer, bill_id:integer, product_amount:integer, product_price:decimal, transaction_amount:decimal

  • product_amount - 这将是通过此交易购买的 X 个产品单位,假设我买了 10 个苹果,所以 Transaction 对象将有 product_amount 等于 10
  • product_price - 当时产品的当前价格,与购买时苹果产品的价格相同
  • transaction_amount - 交易总额,假设是苹果的 10 倍价格

这样您就可以跟踪在 Y 时间购买了多少产品,当时的产品价格是多少,总金额是多少。

现在,当您想知道您在 Y 月销售了多少 X 产品时,您可以Transaction.where("product_id = ? and created_at between Y and Y", x.id).sum(:product_amount)

【讨论】:

  • product_amount、product_price和transaction_amount有什么区别?
  • @Dbugger product_amount - 这将是通过此交易购买的 X 个产品单位,假设我购买了 10 个苹果,因此交易对象的 product_amount 等于 10。product_price - 当前产品当时的价格,与购买时苹果产品的价格相同。 transaction_amount - 交易总额,假设是苹果的 10 倍价格
  • 在这种情况下:a) transaction_amount 是不必要的字段,因为它可以从其他 2 个字段中计算出来,不是吗? b) 如果要更改产品(如名称描述)甚至删除,这会破坏它们出现的交易(以及账单),不是吗?
  • @Dbugger - 是的,transaction_amount 对于大多数金融应用程序的工作方式而言,对于诸如 Transaction 之类的对象来说并不是真正需要拥有一个很好的属性。如果要更改产品,那么如果您从Transaction.first.product 关系中调用它,那么产品的名称确实会更改,但这就是它应该如何工作的。如果您确实删除了产品,它也会中断从交易中调用产品。在这种情况下,您始终可以向 Transaction 添加更多属性以使其永久化,以防产品被删除,例如 product_desc:string, product_name:desc 等。
猜你喜欢
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 2011-07-16
  • 2018-05-18
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多