【发布时间】:2017-03-09 16:40:18
【问题描述】:
我的架构如下所示:
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,并为刚刚创建的新 Cart 创建一个新的 CartItem。我的问题是
如何获取用户选择的变体和选项?
*注意:我不想在 json 中发送 optionValueIds 和 variantId 的数组并计算并将价格复制到 CartItem:我真的需要那些 @ 987654330@s 和 variantIds 持久化,即在数据库中。
现在,CartItem 只包含Product 的id,显然Product.Variants 会给出所有可能的变体,OptionTypes 和OptionValues 也是如此
我浅浅地观察了 Spree 是如何做到这一点的:CartItem 有 variant_id 而不是 product_id。换句话说,他们将Variants 添加到购物车并获得产品对象:via 变体。好吧,它们消除了单独发送variantId 的需要,但我仍然不知道它们是如何获得的,以及它们存储用户选择的optionValueIds 数组的位置。我也看过这个SO Post,但它没有任何答案,而且它更具体到 Spree。
我想到了什么?
- 在
CartItem中添加另一列options_chosen,并发送用户选择的optionValueIds 序列化数组; 为什么会不好? 首先,它不适用于Combo。其次,原子性丢失了。 - 在名为
CartVariant的新模型中添加列options_chosen,并引用Variant并将CartVariants Spree 方式添加到购物车。 我的想法:我不知道这是否是正确的方法。获取产品对象应该类似于CartItem.CartVariant.Variant.Product,我不知道如何让Combos 工作。顺便说一句,即使在这里原子性也丢失了;
【问题讨论】:
-
嗨,Zeke,我现在正在努力解决这个确切的问题。你想通了吗?我有一个产品页面,其中包含两个可供客户选择的变体。我想了几种方法来做到这一点,但他们都觉得自己像个黑客。
标签: ruby-on-rails database-schema shopping-cart