Rails - 数据模型实体之间的复杂关系

时间:2014-01-13 02:37:36

标签: ruby-on-rails database-design model

我正在Rails中编写一个软件。模型之间的两个关系让我的头脑旋转,属性应该驻留在哪里。这是一种非典型的定价方案,涉及销售给某些客户的产品价格。我们的产品可能会以不同的价格出售,具体取决于客户。我们出售的一些大公司已经将我们的价格谈判了一点。

General Pricing Applicable to most customers
  Product A -> $50
  Product B -> $60
  Product C -> $70

因此,在这种情况下,很容易说产品具有价格属性。然而,该公司已与一些大客户协商价格,以下可能发生以下情况。

ACME Corporation
  Product A -> $45
  Product B -> $56
  Product C -> $64

ABC Incorporated
  Product A -> $43
  Product B -> $55
  Product C -> $66

这些价​​格是经过协商而非基于原价的折扣百分比。这引入了每个产品可能具有许多价格的问题,具体取决于客户。我该如何建模呢?在大多数用例下,以下工作。

Customer has_many :quotes
Quote belongs_to :customer

Quote has_many :quote_items
QuoteItem belongs_to :quote

Product has_many :quote_items
QuoteItem belongs_to :product

但由于产品的价格因客户而异,因此如何建模?例如,产品与客户有多对多的关系吗?

2 个答案:

答案 0 :(得分:0)

不确定基础设施是如何布局的,但这是一个想法。

Customer has_many :products
Product belongs_to :customer

然后转到产品型号并创建一个"引用"属性。

然后你可以做例如

ACME.ProductA.quote
=> $45

编辑(添加更多)

嗯,你必须详细说明......事实上,如果你想获得库存-say-所有的productA实例,只需做一些(概念上的)

listOfProducts = Product.find_by_<name>("productA") 

for each productA from listOfProducts 
  print productA.quote 

如果您想进一步获取产品的客户,您可以通过URL解析来跟踪客户的ID

答案 1 :(得分:0)

我提出的解决方案是产品和客户之间的多对多关系,并使用名为product_customers的查找表来跟踪价格属性。不确定这是否是最优雅的方法,但它将重复保持在最低限度。缺点是处理表格的额外复杂性。如果有人想出更优雅的答案,我会给他们分数。

Customer has_many :products, :through => :customer_products
Customer has_many :customer_products
Customer has_many :quotes
Quote belongs_to :customer

Product has_many :customers, :through => :customer_products
Product has_many :customer_products
Product has_many :quote_items
QuoteItem belongs_to :product

CustomerProducts belongs_to :customers
CustomerProducts belongs_to :products

Quote has_many :quote_items
QuoteItem belongs_to :quote