Должна ли моя цена иметь много метрик или принадлежать метрике? - PullRequest
2 голосов
/ 30 января 2012

У меня есть следующие модели:

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

Сценарий при добавлении новой цены - это вы сначала ..

  1. Выберите продукт (продукт)
  2. Дайте стоимость (Цена)
  3. Если указана цена в метрических единицах, заполните эти атрибуты. (Метрика)

Я запутался в ассоциациях. Я знаю, что продукты могут иметь много разных метрик, но это ассоциация :through или цена относится к метрике? Прямо сейчас в моей таблице метрик у меня есть product_id и price_id, но так ли это? Я не думаю, что одна цена может иметь много разных метрик, только продукт будет.

Как бы вы это настроили?

Спасибо.

1 Ответ

2 голосов
/ 30 января 2012

Как указал Мэтью Ленер , наличие Metric в качестве собственной таблицы - это ненужная абстракция.Продукт и единица измерения (то, что вы называете метрикой - я считаю, что это неправильное название и ведет вас по неверному пути) могут жить вместе в одной таблице.Нет смысла позволять единицам изменяться независимо от продукта.Каждый продукт измеряется в определенной единице, которая является неизменной.Например, продукт A может измеряться по весу, продукт B по объему и продукт C по длине.Не имеет никакого смысла вообще предоставлять гибкость для измерения продукта А в любой единице, кроме веса, и такая гибкость может фактически быть источником непреднамеренных ошибок: если единицы измерения находятся в отдельной таблице и относятся к нимпо внешнему ключу они могут обновляться независимо от продукта, вызывая ошибки того типа, которые могут стать измеримыми в бессмысленной единице.

Это тот случай, когда анализ "общности / изменчивости" помогает определить необходимые отношения.Выясните, что остается постоянным, а что может меняться.В вашем примере отношение между продуктом и ценой за единицу может варьироваться, но соотношение между продуктом и единицей измерения должно быть фиксированным.Запишите цену с точки зрения цены за единицу и сохраните единицу измерения вместе с продуктом.Также я думаю, что может быть более понятным назвать цену «цена за единицу» - цена за единицу измерения, в которой продукт может быть продан.

Я бы назвал это так:

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 тарелок, и у вас есть цена за единицу тарелки.

На другой ноте, если вы храните данные о ценах, используйте целые числаили десятичные типы.Не используйте поплавки.См. этот ответ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...