Rails,The Pizza,Topping和Order中的数据库设计建议

时间:2012-04-08 16:23:23

标签: ruby-on-rails database database-design many-to-many

是的,它与披萨比喻的另一个数据库问题。 我见过的那些似乎没有恰到好处地点击,所以这里就是。

我需要能够在一个订单中订购多个配料的多个披萨。 它是一个基本的购物车模式,但配件使其难以实施。

基础模型是,

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

[补充]

有些说明,数据库设计适用于购物应用,因此能够通过管理员设置“菜单”,用户能够看到菜单,并从中进行订购势在必行。

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

  

芝士比萨饼可以加入额外的橄榄和额外的奶酪作为浇头

     

Peperoni Pizza只能添加额外的配料奶酪

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

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

  

Peperoni Pizza加上额外的奶酪

     

含有额外橄榄的Cheeze Pizza

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

我能想到的只是添加一个

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

首先,我同意Zabba - Pizza应该属于Orderclass 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 。现在,我认为您可以应用更简单的解决方案。从我所读过的内容以及如果我没有弄错,你可以使用3种型号。

{{1}}

答案 2 :(得分:0)

好的,我想出了一种适合我的方法,包括每种型号的解释 在每个上面。

比萨模型,用于创建可由客户订购的比萨饼列表,也与订单相关联,以指示订购了哪个比萨饼。

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

然后有一个管理页面来创建和关联比萨饼和浇头,以及一个订单页面来创建订单,这应该有效。通过这种方式,它很容易进行销售分析,其中浇头最受欢迎的是什么披萨,什么不是。