我正在使用ruby on rails建立一个电子商务商店,我在这个项目中发现的挑战之一是如何存储产品变体的所有可能组合。
为了简化问题,这里有一个link帖子,它回答了如何创建产品的多个变体。但是这种设计在我看来有局限性。我担心的是如何保存产品的变体,该产品是附加到产品的所有属性的组合。
例如,如何同时创建颜色红色和尺寸中等的变体,而颜色和尺寸是附加到产品的属性。欢迎提出任何意见和建议。提前谢谢。
答案 0 :(得分:1)
从概念上讲,我认为将每个变体分开Product
是最简单的。在大多数电子商务应用程序中,这是有道理的 - 每个变体都有自己的SKU,并且可能因任何数量的不同属性而有所不同:尺寸和颜色可能适用于T恤,但裤子可能有腰围和内部长度, 例如。因此,只需使用正确的属性创建一堆Products
。
但是,您希望变体(例如,相同样式的多个裤子尺寸)一起出现在同一页面上。为此,我会创建一个单独的类(例如ProductGroup
)has_many :products
。 ProductGroup
代表商店同一页面上显示的所有商品。对于许多产品,它们可能是Product
中唯一的ProductGroup
,但对于具有尺寸/颜色选项的产品,您将拥有多个产品。
然后,您的ProductPageController#show
方法可以显示特定的ProductGroup
。编写一些控制器/视图帮助程序逻辑,以确定在ProductGroup
的成员之间共享哪些属性,并像往常一样显示它们,但是对于任何未共享的属性,请创建<select>
或类似于选择那些属性。
如果您想制作包含所有变体的单个Product
,您需要处理每个产品的不同属性可能不同的事实。最简单的方法是将不同的属性存储为序列化哈希。例如,如果您的数据库是PostgreSQL,我使用jsonb
列类型取得了很好的成功。这将允许您执行此类操作(如果您的Product
模型上有一个名为variants
的jsonb列:
tshirt = Product.new
tshirt.variants = { size: ["S", "M", "L", "XL"], color: ["red", "blue"] }
pants = Product.new
pants.variants = { inseam: ["30", "32", "34", "36", "38"], waist: ["30", "32", "34", "36", "38"] }
然后,如果你想找出(在你的控制器中)可能变化的属性,你可以这样做:
tshirt.variants.keys # ["size", "color"]
pants.variants.keys # ["inseam", "waist"]
因此,在控制器/视图级别,您只需要遍历这些键并为每个键生成一个用户界面(例如<select>
)。
有关在Rails中使用PostgreSQL jsonb
的更多信息,您可以查看this tutorial(特别是标题为&#34;我如何在Rails和#34中执行此操作的部分;) 。还有MySQL的json
数据类型,或者您可以查看Rails&#39; serialize
method。