【问题标题】:The better model design for product in online-shopping store网购商店产品模型的更好设计
【发布时间】:2014-07-28 22:52:18
【问题描述】:

如何为同一产品设计不同颜色、尺寸、数量和价格的模型。

这是我目前的模型方案,

Product
* Name
* Price
* Color
* Quantity
* Size

如何在同一购物区展示具有不同属性的同一产品?

我以A&F购物页面为例,

当您访问此页面时,表示您正在购买COBBLE HILL TEE

我认为不同颜色和大小的COBBLE HILL TEE必须是Product model中不同的产品实例,对吧?

比如,以下三个实例属于COBBLE HILL TEE,但它们在模型中是不同的实例

 `COBBLE HILL TEE`, `$39`, `Red`, `1`, `XL`
 `COBBLE HILL TEE`, `$39`, `White`, `3`, `L`
 `COBBLE HILL TEE`, `$37`, `White`, `5`, `S`

所以应该有一个列来标识应该将哪些产品收集到同一个产品中,比如COBBLE HILL TEE,对吧?

我是否应该添加一个名为product_sn的列,当这些记录在product_sn中具有相同的值时,它们应该聚集在同一个购物页面中?

抱歉我的英语很差,无法描述我的问题

【问题讨论】:

  • 你的Current model schema 是完美的。继续吧。

标签: ruby-on-rails e-commerce shopping-cart


【解决方案1】:

我喜欢软件中的modularity,并据此创建模型。我想你会从这个想法中受益,所以我会为你解释一下:


模型

我喜欢保留模型以使模型具有可扩展性 - 这样您就可以添加 1,000,000 个项目,并且仍然让它以正确的方式工作。

为此,我们有“孤岛”数据库(我不确定这是否是正确的术语),然后围绕它有“参考”模型。

“筒仓”数据库/模型基本上存储静态数据(例如productsusers)。参考数据库/模型基本上为silo 数据库提供了更多范围 - 例如将options 添加到productsprofile 用于users

在你的情况下,我肯定会这样做:

#app/models/product.rb
Class Product < ActiveRecord::Base
    has_many :options, as: :optable do
       def colours 
          where name: "colour"
       end
    end
end

#app/models/option.rb
Class Options < ActiveRecord::Base
    belongs_to :optable, polymorphic: true
end

架构:

#products
id | name | SKU | stock | etc | etc | created_at | updated_at

#options
id | optable_type | optable_id | name | value | created_at | updated_at

--

协会

这是一个polymorphic association(因此您可以将options 模型与其他不相关的模型一起使用):

这意味着您可以拨打电话:

@product = Product.find params[:id]
@product.options #-> returns all `Option` records for `product` (`price`, `size`, `etc`)

如果你设置正确,你应该可以这样做:

#config/routes.rb
resources :products, only: :show #-> domain.com/products/14

#app/controllers/products_controller.rb
class ProductsController < ActiveRecord::Base
   def show
       @product = Product.find params[:id]
   end
end

#app/views/products/show.html.erb
<%= @product.name %>
<% @product.options.each do |option| %>
    <%= option.size %>
    <%= option.price %>
    <%= option.colour %>
<% end %>

如果您想调用productcolour 选项,您可以这样做:

@product = Product.find params[:id]
@product.options.colours #-> will output all colours for the product

注意事项

我的代码的主要警告之一是我提供的options 没有以任何方式结构化。如果您想为产品提供特定的set 选项(例如为特定产品提供sizecolourquantity,您可能希望在Option 模型中使用self-referential association,如果你愿意,我可以做

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2012-11-03
    相关资源
    最近更新 更多