不简单的购物车需要专家解答

时间:2012-03-16 12:31:08

标签: ruby-on-rails ruby-on-rails-3

对于我的问题得到-1,我感到非常惊讶。它们并不简单,它们很复杂。     
我的line_items表有product_id cart_id order_id 每当客户点击产品时,它都会被添加到购物车中。 但我的公寓,汽车,旅游套餐不是产品。公寓告诉我,无论谁想到我能以某种方式连接我的汽车产品。它们具有根本不同的属性。当客户点击公寓并选择2卧室时,我们可以说如何添加到line_items我的apartment_id或car_id或tour_id。我不需要关于STI或多重继承的理论。我需要完全回答。感谢rails专家。

1 个答案:

答案 0 :(得分:2)

首先,你应该格式化关于SO指南的问题,这可能是因为你得到了投票...

无论如何,我认为你正在寻找polymorphic associations

假设Product是您商店中可用的产品,而LineItem代表订单中的产品:

class LineItem < ActiveRecord::Base
  has_one :product  # ONE LineItem references ONE product in the shop
  belongs_to :cart  # respectively belongs_to :order
end

class Cart < ActiveRecord::Base
  has_many :line_items  # ONE Cart HAS MANY LineItems
end

class Product < ActiveRecord::Base
  belongs_to :buyable, :polymorphic => true

  # here you would have general attributes representing a product, e.g. 'name'
end

class Car < ActiveRecord::Base
  has_one :product, :as => :buyable

  # here you would have specific attributes in addition to the general attributes in
  # product, e.g. 'brand'
end

class Apartment < ActiveRecord::Base
  has_one :product, :as => :buyable

  # here you would have specific attributes in addition to the general attributes in
  # product, e.g. 'address'
end

为了完成这项工作,您的products表必须有两列

  • buyable_type(string)
  • buyable_id(整数)

因此,在您的代码中,您可以通过

检查您的产品究竟是什么
@product = Product.find(params[:id])

if @product.buyable.is_a? Car
  puts @product.buyable.brand
elsif @product.buyable.is_a? Apartment
  puts @product.buyable.address
end