添加用户选择购物车的产品选项的正确方法是什么?

时间:2016-10-27 05:54:23

标签: ruby-on-rails database-schema shopping-cart

以下是我的架构的样子:

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。我的问题是

  

如何获取用户选择的变体和选项?

*注意:我不想在json中发送optionValueIdvariantId的数组,并计算并将价格复制到{ {1}}:我真的需要那些CartItemoptionValueId来保持,即在db。

目前,variantId仅包含CartItem的{​​{1}},显然id会提供所有可能的变体,Product和{{1}相同}}

我浅薄地看了 Spree 是如何做到的:Product.VariantsOptionTypes而不是OptionValues。换句话说,他们会将CartItem添加到购物车并获取产品对象variant_id变体。好吧,他们不再需要单独发送product_id,但我仍然不知道他们如何获得以及他们存储了Variants用户选择的数组的位置。我也看过这个SO Post,但它没有任何答案,而且它更具体到 Spree

我的想法是什么?

  • :via中添加另一列variantId,然后发送用户已选择的optionValueId个序列化数组; 为什么会这么糟糕?首先,它不适用于options_chosen。其次, Atomicity 丢失了。
  • 在引用CartItem的名为optionValueId的新模型中添加列Combo,并将options_chosen 狂欢方式添加到购物车。 我的想法:我不知道这是 正确的做法。获取产品对象应该与CartVariant类似,我不知道如何使这项工作适用于Variant。顺便说一句,即使在这里,原子性也会丢失;

0 个答案:

没有答案