2012-01-30 1 views
2

У меня есть следующие модели:Должна ли моя цена иметь много показателей или принадлежать метрике?

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. Выберите продукт (Product)
  2. Отдайте стоимость (цена)
  3. Если его метрическая единица на основе цены, заполнить эти атрибуты. (Метрическая)

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

Как бы вы это определили?

спасибо.

+2

Действительно ли цена должна быть связана с метрикой? Для меня похоже, что продукт должен иметь цену и метрику, но не нужно идти дальше? –

+0

Согласен с @MatthewLehner. Это должно быть просто, как он сказал выше. –

ответ

2

Как указано Matthew Lehner, имея метрику в качестве ее собственного стола, является ненужной абстракцией. Продукт и блок (то, что вы называете метрикой, которое, как мне кажется, неверно, и приводят вас к неправильному пути), могут жить вместе в одной таблице. Нет смысла разрешать устройства независимо от продукта. Каждый продукт измеряется в определенной единице, которая неизменна. Например, продукт А может быть измерен по весу, продукт В по объему и продукт С по длине. Не было бы вообще никакого смысла позволять гибкость для измерения продукта А в любой единице, отличной от веса, и такая гибкость могла бы быть, по сути, источником непреднамеренных ошибок: если единицы живут в отдельной таблице и передаются посторонним ключом, то они могут быть обновлены независимо от продукта, вызывая ошибки типа, где может стать измеримым в нечувствительной единице.

Это случай, когда "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.

+0

Спасибо за ответ Вольфрам. У меня есть вопросы. Что, если Брокколи можно продать кусками? Допустим, у меня было 1 кусочек брокколи, продаваемых на пикнике, а также продажи в магазине в фунтах и ​​навалом для бизнеса в килограммах. Это все еще обрабатывается одинаково? Кроме того, могу ли я просто сохранить все это в своей модели «Цена» и предоставить модель «UNITS» модели «Product»? – LearningRoR

+2

@wrbg - Вы можете предоставить разные цены, да, но у вас будет только одна единица. Я думаю, что вы говорите, это другая запись продукта, например: «ломовая древесина», измеренная в фунтах, по сравнению с «2x4 6 футов в длину», измеренная в подсчетах. Таким образом, у вас может быть «объемная брокколи» в кусках (измеряется по счету) и «брокколи» в фунтах. Отдельные продукты могут иметь наибольший смысл, так как они могут обрабатываться, упаковываться, запасы по-разному. PS: Если вам понравился мой ответ, нажмите на флажок «принять» рядом с ним. –