2016-10-27 6 views
1

Вот как моя схема выглядит следующим образом:Что такое правильный способ добавления опций товара пользователь выбрал в корзину?

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. Кстати, даже здесь атомарность теряется;
+0

Привет Зик, я борюсь с этим точным вопросом прямо сейчас. Вы поняли это? У меня есть страница продукта с двумя вариантами, доступными для клиента на выбор. Я подумал о нескольких способах сделать это, но все они чувствуют себя взломанными. – Mark

ответ

0

Я включил product_id как скрытое поле на странице продукта, а затем создал кнопки ввода радиосигнала, чтобы выбрать конкретный вариант. Когда я отправил форму, я передаю параметры product_id и variant_id в контроллер LineItems, где я использую их для создания моего line_item. Имеет ли это смысл? Я работаю над этим часами, и это, наконец, работает!

<%= form_tag line_items_path, method: :post, :id => "print_form" do %> 
    <%= hidden_field_tag :product_id, @product.id %> 

    <% @product.variants.each do |variant| %> 
    <label> 
     <input type="radio" name="variant_id" value="<%= variant.id %>" /><%= variant.name %> 
    </label> 
    <% end %> 
+0

Нет абсолютно никакой проблемы с поиском того, какой «вариант» пользователь добавил в 'cart', becoz Я не добавляю' продукты', а 'варианты' в корзину _ (я могу идентифицировать продукт с помощью' variant.product') _ as _Spree_ делает. Таким образом, мне даже не нужно отправлять 'product_id' на сервер. –

+0

Реальная проблема заключается в отправке 'OptionTypes' и' OptionValues'. Более того, они вложены в 'Variant', когда дело доходит до' Combo', тем самым не позволяя нам напрямую связывать их с 'CartItem' или' LineItem' –

+0

Правильно, но почему бы вам не добавить OptionTypes и OptionValues , так же, как я отправляю варианты Вариантов вместе с Продуктом? Он просто становится множественным связанным LineItems в моей тележке. – Mark

 Смежные вопросы

  • Нет связанных вопросов^_^