0

我有一个包含以下列的产品模型:

name:string
price:integer

我还有一个购物车模型、line_item 模型、一个订单控制器:非常基本,但你明白了。

我需要做(并且已经做过)是为产品模型添加尺寸(因为它是用于 T 恤的)和颜色。很公平,

rails g migration AddSizeToProducts size:string

工作得很好,同样适用于颜色。

购买流程的设置方式如下:

  1. 选择衬衫(一页)

  2. 选择衬衫后,带您进入下一页

  3. 在此页面上,您将选择衬衫的颜色和尺码。

从我收集的信息来看,使用select不会与数据库绑定,所以我想collection_select在这里更合适?或者这样的事情可以吗?

<%= select @product, :id, [ ["Small",1], ["Medium",2], ["Large",3]] %>

另外,在选择产品之前(从上面的步骤 1 开始),我将如何使用尺寸(即小/中/大)和颜色(即黑色/蓝色/白色)“预先填充”这些字段,而无需将它们与特定产品相关联?

对此事的任何意见表示赞赏。

4

1 回答 1

1

无需将它们与特定产品相关联

这让我很困惑——您肯定想将选择框与特定产品的选项相关联吗?


我个人会确保设置“购买流程”以在整个过程中传递产品 ID。我会通过在路线中使用嵌套资源来做到这一点:

#config/routes.rb
resources :products do
    get :step2 #-> /products/1/step2
end

这将params[:product_id]通过该过程,允许您在下一步中使用它:

#app/controllers/products_controller.rb
def step2
    @product = Product.find(params[:product_id])
end

#app/views/products/step2.html.erb
<%= collection_select(:product, :size_id, @product.size, :id, :name, prompt: true) %>

看过之后,我认为您真正的问题是将您size作为字符串存储在Product模型中。我会创建一个名为 的单独模型sizes,然后使用一个名为 的连接模型products_sizes来允许您将所需的任意数量的尺寸与每个产品关联起来。然后您就可以调用关联数据


为什么不这样做:

#app/models/product.rb
Class Product < ActiveRecord::Base
    has_many :product_sizes
    has_many :sizes, through: :product_sizes
end

#app/models/size.rb
Class Size < ActiveRecord::Base
    has_many :product_sizes
    has_many :products, through: :product_sizes
end

#app/models/product_size.rb
Class ProductSize < ActiveRecord::Base
    belongs_to :product
    belongs_to :size
end

这允许您存储许多不同产品的尺寸,允许您从模型中选择 ID ProductSize,直接在您的购物车模型中引用它们:

#app/models/cart.rb
Class Cart < ActiveRecord::Base
    belongs_to :user
    belongs_to :product
    belongs_to :product_size
end

#carts
id | user_id | product_id | product_size_id | created_at | updated_at

这意味着如果您创建一个新的购物车项目,您将能够直接将 a 分配给product记录size

<%= collection_select(:product, :product_size_id, @product.sizes, :id, :name, prompt: true) %>
于 2014-04-10T07:13:06.420 回答