我的价格应该有多个度量标准还是属于度量标准?

时间:2012-01-30 02:23:05

标签: ruby-on-rails ruby ruby-on-rails-3

我有以下型号:

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个属性:

  1. $ 1.50 = :cost_per_metric_unit
  2. 2 = metric_unit_amount
  3. LB = :metric_unit
  4. 首先添加新价格的方案是..

    1. 选择产品(产品)
    2. 给出费用(价格)
    3. 如果是基于公制单位的价格,请填写这些属性。(公制)
    4. 我对这些关联感到困惑。我知道产品可以有许多不同的度量标准,但这是:through关联还是价格属于度量标准?现在,在我的度量表中,我有product_idprice_id但是这样对吗?我不认为一个Price可以有很多不同的度量标准,只有一个产品会。

      你会如何设置它?

      谢谢。

1 个答案:

答案 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