我有以下型号:
class Price < ActiveRecord::Base
belongs_to :product
end
class Metric < ActiveRecord::Base
belongs_to :price
belongs_to :product
end
在我的应用程序中,由于产品没有变化,但价格确实如此,我将新价格添加到产品中。我的问题是,如果价格是以公制单位衡量的,例如:
Broccoli is $1.50 per 2 LBs
这将产生3个属性:
:cost_per_metric_unit
metric_unit_amount
:metric_unit
首先添加新价格的方案是..
我对这些关联感到困惑。我知道产品可以有许多不同的度量标准,但这是:through
关联还是价格属于度量标准?现在,在我的度量表中,我有product_id
和price_id
但是这样对吗?我不认为一个Price可以有很多不同的度量标准,只有一个产品会。
你会如何设置它?
谢谢。
答案 0 :(得分:2)
正如Matthew Lehner指出的那样,将Metric作为自己的表是一种不必要的抽象。产品和单位(你称之为公制 - 这是一个用词不当,我相信,并引导你走错路),可以在同一张桌子上共同生活。允许单位独立于产品而变化没有意义。每个产品都是以不可变的特定单位来衡量的。例如,产品A可以按重量计,产品B按体积计,产品C按长度计。完全没有任何意义允许灵活地在除重量之外的任何单位中测量产品A,并且具有这种灵活性实际上可能是源意外错误:如果单元存在于单独的表中并且被引用通过外键,它们可以独立于产品进行更新,从而导致在非感性单元中可能变得可测量的类型错误。
这是"commonality/variablity" analysis有助于确定所需关系的情况。弄清楚什么保持不变,什么可以变化。在您的示例中,产品和单价之间的关系可能会有所不同,但产品和单位度量之间的关系应该是固定的。以每单位价格记录价格,并将单位指标与产品一起存储。此外,我认为可以更清楚地称价格“单价” - 产品可以出售的每单位度量价格。
我会这样设计:
class UnitPrice < ActiveRecord::Base
belongs_to :product
end
class Product < ActiveRecord::Base
UNITS = %w(kg lbs liters gallons floz oz meters inches feet count) # add here as needed
has_one :unit_price
validates :unit, :inclusion => {:in => UNITS}
def price_quote(amount)
unit_price * amount
end
end
通过这种方式,您可以在产品上支持多个单价,例如:批量折扣,销售优惠等
顺便说一下,如果简单地以计数而不是重量,体积等来测量项目,则该单位是“计数”,例如, 5个餐盘,你有1个餐盘的单价。
另一方面,如果您要存储价格数据,请使用整数或十进制类型。不要使用浮子。请参阅this answer。