0

是的,这是另一个与比萨饼类比的数据库问题。我看到的那些似乎没有正确点击,所以这里。

我需要能够在一个订单中订购多个带有任意数量浇头的比萨饼。它是一种基本的购物车模式,但浇头使其难以实施。

基本模型是,

class Pizza < ActiveRecord::Base
  has_and_belongs_to_many :orders
  has_and_belongs_to_many :toppings
end

class Topping < ActiveRecord::Base
  has_and_belongs_to_many :pizzas  
end

比萨饼和浇头表用作可订购的比萨饼和浇头类型信息的持有者。

class OrdersPizzas < ActiveRecord::Base
  belongs_to :order
  belongs_to :pizza
end

class PizzasToppings < ActiveRecord::Base
  belongs_to :topping
  belongs_to :pizza
end

class Order < ActiveRecord::Base
  has_and_belongs_to_many :pizzas
end

[添加]

澄清一下,数据库设计是为购物应用程序设计的,因此管理员能够设置“菜单”,并且用户能够看到菜单并从中订购是必不可少的。

这个操作分为两个步骤,首先你需要通过创建比萨饼和浇头来制作菜单,并将它们关联起来,并不是所有的比萨饼都可以有所有的浇头。

奶酪披萨可以有额外的橄榄和额外的奶酪作为配料

意大利辣香肠披萨只能有额外的奶酪作为配料

第二步实际上是根据输入的数据下订单,因此都是多对多。

现在的问题是,输入上面的数据后,我要下单

意大利辣香肠披萨加额外的奶酪

芝士披萨加额外的橄榄

在一个订单中,它应该如何设计?

我能想到的就是添加一个

class OrdersPizzasToppings < ActiveRecord::Base
  belongs_to :orders_pizzas
  belongs_to :topping
end

所以我可以区分哪个披萨有浇头,但这看起来不是正确的方法。

4

3 回答 3

1

我认为您需要一个连接表来表示应用于一个披萨的一组配料,并分离出应用配料的标准披萨:

class Pizza < ActiveRecord::Base
  belongs_to :order
  belongs_to :standard_pizza
  has_one :pizza_topping
  has_many :toppings, through: :pizza_topping
end

class Order < ActiveRecord::Base
  has_many :pizzas
end

class Topping < ActiveRecord::Base
  has_many :pizza_toppings
  has_many :pizzas, through: :pizza_toppings
end

# A set of toppings applied to one pizza
class PizzaTopping < ActiveRecord::Base
  belongs_to :pizza
  belongs_to :topping
end

# Pepperoni pizza, Cheese pizza ...
class StandardPizza < ActiveRecord::Base
  has_many :pizzas
end
于 2012-04-09T14:08:48.763 回答
0

首先,我同意 Zabba - aPizza应该属于 one Order。现在,我认为您可以应用一个更简单的解决方案。根据我的阅读,如果我没记错的话,您可以使用 3 个模型。

class Pizza < ActiveRecord::Base
  belongs_to :order
  has_many :toppings
end

class Order < ActiveRecord::Base
  has_many :pizzas
end

class Topping < ActiveRecord::Base
  belongs_to :pizza  
end
于 2012-04-08T17:23:39.127 回答
0

好的,已经想出了一种对我有用的方法,每个模型的解释都包含在每个模型之上。

Pizza 模型用于创建客户可以订购的披萨列表,它也与订单相关联,以指示已订购的披萨。

class Pizza < ActiveRecord::Base  
  has_many :pizza_orders
  has_many :orders, :through => :pizza_orders
  has_and_belongs_to_many :toppings
end

Topping 模型,为了创建可以与某些比萨饼相关联的配料列表,还与每个比萨饼订单的连接表相关联,以指定哪个比萨饼订购了配料。

class Topping < ActiveRecord::Base
  has_and_belongs_to_many :pizzas
  has_and_belongs_to_many :pizza_orders
end

披萨和浇头的连接表,这是必需的,因为没有它,您无法指定哪些浇头可以或不能与披萨一起订购。毕竟,将意大利辣香肠配料列在素食披萨上可能会冒犯某人。

class PizzasToppings < ActiveRecord::Base
  belongs_to :pizza
  belongs_to :topping
end

订单模型,这只是将所有连接表保存在一起。

class Order < ActiveRecord::Base
  has_many :pizza_orders
  has_many :pizzas, :through => :item_orders
end

比萨饼和订单之间的连接表,这个多对多是一个有很多通过,而不是一个拥有和属于很多,因为在 Rails 中你不能直接操作 HBATM 连接表(据我所知),你需要能够因为期权关系。

class PizzaOrder < ActiveRecord::Base
  belongs_to :pizza
  belongs_to :order

  has_and_belongs_to_many :options
end

用于指示已为订单中的特定比萨饼选择了哪些配料的连接表。

class PizzaOrdersToppings < ActiveRecord::Base
  belongs_to :pizza_orders
  belongs_to :topping
end

Then having an admin page to create and associate the Pizzas and toppings, and an order page to create orders, this should work. This way its easy to make sales analysis, which toppings is most popular with what pizza, and what not.

于 2012-04-10T03:08:03.950 回答