是的,它与披萨比喻的另一个数据库问题。 我见过的那些似乎没有恰到好处地点击,所以这里就是。
我需要能够在一个订单中订购多个配料的多个披萨。 它是一个基本的购物车模式,但配件使其难以实施。
基础模型是,
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
所以我可以区分哪些披萨配有浇头,但这看起来不是正确的方法。
答案 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
应该属于Order
个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
。现在,我认为您可以应用更简单的解决方案。从我所读过的内容以及如果我没有弄错,你可以使用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
然后有一个管理页面来创建和关联比萨饼和浇头,以及一个订单页面来创建订单,这应该有效。通过这种方式,它很容易进行销售分析,其中浇头最受欢迎的是什么披萨,什么不是。