0

我有以下安排

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

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

选项模型,用于创建可与某些比萨饼关联的选项列表,还与每个比萨饼订单的连接表相关联,以指定哪个比萨饼订购了浇头。

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 => :pizza_orders
end

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

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

  has_and_belongs_to_many :toppings
end

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

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

然后我有一个管理页面来创建和关联比萨饼和配料。

但我不知道如何创建订单表格。用户应该能够添加比萨饼并选择一个或多个已创建的浇头

4

2 回答 2

2

ryan bates制作的嵌套模型形式第 1 部分有点旧,但我希望它对您有所帮助,还有这个截屏视频的修订版。

于 2013-09-05T18:19:17.027 回答
1

对不起,我迟到了。

好的,尚未对此进行测试,但希望它能让您有所了解。为了让它工作,这个样本依赖于,

  1. 简单的模式
  2. ryan bates 动态嵌套表格

我必须道歉,这个答案缺少大部分内容,每次更改 <%= f.association :pizzas %> 值时都需要重新渲染 link_to_add_fields 部分,以便包含浇头的隐藏字段匹配已选择的比萨饼。

抱歉,我无法让您完全通过,但我希望这能为您指明正确的方向。

_form.html.erb

<%= simple_form @order do |f| %>

  <%= f.simple_fields_for :pizza_orders do |pizza_orders_fields| %>
    <%= f.association :pizzas %>
    <%= render partial: "pizza_order_fields", locals: {f: pizza_orders_fields}%>
    <%= link_to_add_fields "Add", f, :pizza_orders %>
  <% end %>
<% end %>

Pizza_order_fields.html.erb 看起来像

<fieldset>
  <%= f.hidden_field :_destroy %>
  <%= link_to "Delete", '#', class: "remove_fields btn btn-danger" %>
  <%= f.association toppings_pizza_orders, collection: f.object.pizza.toppings %>
</fieldset>
于 2013-09-09T01:19:40.650 回答