以下是我的架构的样子:
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中发送optionValueId
和variantId
的数组,并计算并将价格复制到{ {1}}:我真的需要那些CartItem
和optionValueId
来保持,即在db。
目前,variantId
仅包含CartItem
的{{1}},显然id
会提供所有可能的变体,Product
和{{1}相同}}
我浅薄地看了 Spree 是如何做到的:Product.Variants
有OptionTypes
而不是OptionValues
。换句话说,他们会将CartItem
添加到购物车并获取产品对象variant_id
变体。好吧,他们不再需要单独发送product_id
,但我仍然不知道他们如何获得以及他们存储了Variants
用户选择的数组的位置。我也看过这个SO Post,但它没有任何答案,而且它更具体到 Spree 。
我的想法是什么?
:via
中添加另一列variantId
,然后发送用户已选择的optionValueId
个序列化数组; 为什么会这么糟糕?首先,它不适用于options_chosen
。其次, Atomicity 丢失了。CartItem
的名为optionValueId
的新模型中添加列Combo
,并将options_chosen
狂欢方式添加到购物车。 我的想法:我不知道这是 正确的做法。获取产品对象应该与CartVariant
类似,我不知道如何使这项工作适用于Variant
。顺便说一句,即使在这里,原子性也会丢失;