Как указал Мэтью Ленер , наличие 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 тарелок, и у вас есть цена за единицу тарелки.
На другой ноте, если вы храните данные о ценах, используйте целые числаили десятичные типы.Не используйте поплавки.См. этот ответ .