Ruby on Rails:使用has_many关系在嵌套关联中创建新模型

时间:2015-10-29 23:11:06

标签: ruby-on-rails ruby activerecord nested-forms has-many

所以我遇到一个问题,用户需要能够放置order,每个订单都由一个或多个pizza_order模型组成。 pizza_orderpizza模型具有多态关系,因为它可以指向specials表中具有预定义浇头列表的条目,或者它可以指向pizzas表中的一个条目,用户可以选择地壳类型和浇头。

我以前使用Cocoon gem解决了尝试在一个pizza_order中创建多个order条目的问题,这样可以正常工作。当每个pizza_order仅与specials表中的条目相关联时,它甚至可以正常工作。一旦我尝试将自定义披萨条目用于工作,就会开始破碎。

这是新order的样子

<%= form_for @order do |f| %>
  <%= f.fields_for :pizza_orders do |pi_order| %>
    <%= render partial: 'pizza_order_fields', locals: {f: pi_order}%>
  <% end%>
  <div class="add-field">
    <%= link_to_add_association 'Add Pizza', f, :pizza_orders, id: "add_btn", class: "btn btn-primary" %>
  </div>
  <br/>
  <%= f.submit "Place Order", class: "btn btn-primary "%>
<% end %>

每当用户按下“添加比萨饼”时,这将呈现新的部分,以选择特色或定制比萨饼。那个表格看起来像这样

<div class="nested-fields">
  <fieldset data-role="controlgroup" data-type="horizontal" class="form-inline">
  <legend>Specialty Pizzas</legend>
  <% @specials.each do |sp| %>
    <div class="container">
      <%= f.label :pizza_id, sp.get_name_and_cost %>
      <%= f.radio_button :pizza_id, sp.id %>
      <h5>Crust Type:  <%= sp.pizza.crust.name %></h5>
      <h5>Toppings:
      <% sp.pizza.toppings.each do |top| %>
          <%= top.name + (top == sp.pizza.toppings.last ? "" : ",") %>
      <% end %>
      </h5>
      <hr/>
    </div>
  <% end %>
  <div class="container">
    <%= f.label "Custom" %>
    <%= f.radio_button :pizza_id, "Custom", id: "custom_pizza" %>
    <div id="custom_pizza_fields">
      <%= f.fields_for :pizza_id do |pi| %>
          <%= render partial: 'custom_pizza', locals: {pi: pi} %>
      <% end %>
    </div>
  </div>
</fieldset>
<%= f.label :quantity %>
<%= f.number_field :quantity, class: "number_field" %>
<br/>
<%= link_to_remove_association "Delete", f , id: "delete_btn", class: "btn btn-primary" %>
<hr/>

最后,这将部分创建一个自定义披萨,看起来像这样

<h5>Crust Type</h5>
<table class="table">
  <tr>
    <% Crust.all.each do |crust| %>
        <td>
          <%= pi.label :crust, crust.name %>
          <%= pi.radio_button :crust, crust.id %>
        </td>
    <% end %>
  </tr>
</table>
<h5>Toppings</h5>
<table class="table">
  <tr>
    <% Topping.all.each do |topping| %>
        <td>
          <%= pi.label :toppings, topping.get_name_and_cost %>
          <%= pi.check_box :toppings %>
        </td>
    <% end %>
  </tr>
</table>

我很确定问题来自第2 fields_for行,其中<%= f.fields_for :pizza_id do |pi| %>行。:pizza_id。与数据库中已存在的特色披萨不同,当用户下订单时,将创建自定义披萨。所以我认为Toppings此时不会映射到任何内容。

另一个问题是如何返回has_many的集合以映射到pizza模型中的class Order < ActiveRecord::Base belongs_to :user has_many :pizza_orders accepts_nested_attributes_for :pizza_orders end class PizzaOrder < ActiveRecord::Base belongs_to :pizza, polymorphic: true belongs_to :order accepts_nested_attributes_for :pizza, allow_destroy: true end class Special < ActiveRecord::Base belongs_to :pizza validates :pizza, :presence => true validates :cost, :presence => true def get_name_and_cost "#{pizza.name}: $#{cost}" end end class Pizza < ActiveRecord::Base has_and_belongs_to_many :toppings has_many :pizza_orders, as: :pizza belongs_to :crust validates :crust, presence: true end class Topping < ActiveRecord::Base has_and_belongs_to_many :pizzas def get_name_and_cost "#{self.name}: $#{self.cost}" end end class Crust < ActiveRecord::Base has_many :pizzas end 字段?我已经实现了复选框,但我无法验证这是否会返回一个集合,因为我之前的问题暂时停止了进一步的进展。

供参考,以下是使用的模型。

def order_params
  params.require(:order).permit(:cost, pizza_orders_attributes: [:quantity, pizza_attributes: [:crust, :toppings]])
end

最后一件事。这就是我计划处理订单的强类型参数的方法,但我不太确定它是否准确

await

0 个答案:

没有答案
相关问题