Вот как моя схема выглядит следующим образом:Что такое правильный способ добавления опций товара пользователь выбрал в корзину?
Combo | Product | Variant | OptionType | OptionValue
id | id | id, name | id | id
name | name | price | name | name
dicount | combo_id | product_id | variant_id | option_type_id
| price | | price
________________________________________________________________________________________
Cart | CartItem
id | id
user_id | cart_id
| purchasable_id
| purchasable_type
| quantity
//purchasble: polymorphic, Combo and Product are purchasable
Примером может быть гораздо легче понять
Product: Some Shirt, Some Pants, SomeOther Shirt, etc.,
Combo: Shirt + Pants combo (discount: $20)
For the product 'Some Shirt',
Variants: Small ($30), Medium ($35), Large ($40)
OptionTypes: Print, Add-ons
OptionValues for 'Print': CustomLogo ($10), FullSizePrint ($20)
OptionValues for 'Add-ons': Frills ($1), InnerPockets ($2)
Когда я что-то добавить в корзину, Cart
получает создан и новый CartItem
получает создан для новый Cart
только что созданный. И мой вопрос:
Как выбрать вариант и параметры, которые пользователь выбрал?
* Примечание: Я не wan't отправить массив optionValueId
с и variantId
в формате JSON и вычислить и скопировать цену CartItem
: Я действительно нужны эти optionValueId
с и variantId
сек упорствовать т.е. в дБ.
Сейчас CartItem
содержит только id
из Product
и, очевидно, Product.Variants
дали бы все возможные варианты, то же самое для OptionTypes
и OptionValues
я неглубоко смотрел на то, как Шпрее делает это: CartItem
имеет variant_id
вместо product_id
, Другими словами, они добавляют Variants
в корзину и приобретают объект продукта :via
вариант. Ну, они устраняют необходимость отдельной отправки variantId
, но я до сих пор не знаю, как они это делают, и где они хранят массив из optionValueId
пользователей. Я также посмотрел на это SO Post, но у него нет ответа, и более того, это было более конкретно для Spree.
О чем я думал?
- Добавить еще один столбец
options_chosen
вCartItem
и отправить в упорядоченный массивoptionValueId
Пользовательский выбрал; Почему это может быть плохо? Во-первых, он не работает дляCombo
. Во-вторых, Атомность потеряна. - Добавить столбец
options_chosen
в новой модели под названиемCartVariant
ссылающегосяVariant
и добавитьCartVariant
s Шпрее путь в корзину. Мои мысли: Я не знаю, является ли это правильным способом. Получение объекта продукта должно быть какCartItem.CartVariant.Variant.Product
, и я не знаю, как сделать эту работу дляCombo
s. Кстати, даже здесь атомарность теряется;
Привет Зик, я борюсь с этим точным вопросом прямо сейчас. Вы поняли это? У меня есть страница продукта с двумя вариантами, доступными для клиента на выбор. Я подумал о нескольких способах сделать это, но все они чувствуют себя взломанными. – Mark