我正在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
但由于产品的价格因客户而异,因此如何建模?例如,产品与客户有多对多的关系吗?
答案 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