Voilà comment mon schéma ressemble à:Quelle est la bonne façon d'ajouter les options de produits que l'utilisateur a sélectionné pour le panier?
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
Un exemple serait beaucoup plus facile à comprendre
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)
Quand j'ajouter quelque chose au panier, un Cart
est créé et nouveau CartItem
est créé pour un nouveau Cart
vient de créer. Et ma question est
Comment puis-je obtenir la variante et les options utilisateur a sélectionné?
* Note: Je ne wan't pas envoyer un tableau de optionValueId
s et variantId
en JSON et calculer et copie prix à CartItem
: J'ai vraiment besoin de ces optionValueId
s et variantId
s persister à savoir, en db.
En ce moment, CartItem
ne contient que le id
des Product
et évidemment Product.Variants
donneraient toutes les variantes possibles, même pour OptionTypes
et OptionValues
Je regardais peu profondément comment Spree fait cela: CartItem
a variant_id
au lieu de product_id
. En d'autres termes, ils ajoutent Variants
au panier et obtiennent l'objet produit :via
variant. Eh bien, ils éliminent la nécessité d'envoyer séparément variantId
mais je ne sais toujours pas comment ils obtiennent et où ils stockent un tableau de optionValueId
s l'utilisateur a sélectionné. J'ai également regardé ce SO Post mais il n'a aucune réponse et d'ailleurs il était plus spécifique à Spree.
À quoi j'ai pensé?
- Ajouter une autre colonne
options_chosen
dansCartItem
et envoyer dans un tableau sérialisée de l'utilisateur deoptionValueId
a choisi; Pourquoi ça pourrait être mauvais? Tout d'abord, cela ne fonctionne pas pourCombo
. Deuxièmement, Atomicity est perdue. - Ajouter une colonne
options_chosen
dans un nouveau modèle appeléCartVariant
référencementVariant
et ajouterCartVariant
s le chemin de la Spree au panier. Mes pensées: Je ne sais pas si c'est le bonne façon de le faire. Obtenir l'objet de produit devrait être commeCartItem.CartVariant.Variant.Product
et je ne sais pas comment faire ce travail pourCombo
s. Btw, même ici l'atomicité est perdue;
Salut Zeke, je me bats avec cette question précise en ce moment. Avez-vous compris? J'ai une page de produit avec deux variantes disponibles pour un client à choisir. J'ai pensé à quelques façons de le faire, mais ils se sentent tous comme un hack. – Mark