Ruby on rails 3.2 如何在Rails 3中创建带有扭曲的双嵌套模型?

Ruby on rails 3.2 如何在Rails 3中创建带有扭曲的双嵌套模型?,ruby-on-rails-3.2,nested-forms,mass-assignment,rails-models,Ruby On Rails 3.2,Nested Forms,Mass Assignment,Rails Models,我正在创建一个注册,其中有“个人”、“孩子”和“膳食”模型。一个人可以有许多孩子,可以为自己登记许多膳食,也可以为孩子登记许多膳食 关键是,食物只属于人(没有必要将它们分配给孩子们),所以我有一个食物的创造部分,还有一个在孩子们下面的创造 当我提交表单时,我在个人控制器中收到“不能批量分配受保护的属性:膳食”错误 问题是,我如何才能在Children字段_for部分下创建Founds实例,而不会出现此错误,也不会在Founds和Children之间建立连接 这是我的个人模型 class Pers

我正在创建一个注册,其中有“个人”、“孩子”和“膳食”模型。一个人可以有许多孩子,可以为自己登记许多膳食,也可以为孩子登记许多膳食

关键是,食物只属于人(没有必要将它们分配给孩子们),所以我有一个食物的创造部分,还有一个在孩子们下面的创造

当我提交表单时,我在个人控制器中收到“不能批量分配受保护的属性:膳食”错误

问题是,我如何才能在Children字段_for部分下创建Founds实例,而不会出现此错误,也不会在Founds和Children之间建立连接

这是我的个人模型

class Person < ActiveRecord::Base

has_many :meals
has_many :registrations, :dependent => :destroy
has_many :programs, :through => :registrations
has_many :children

attr_accessible :email_address, :first_name, :home_country, :payment, :phone_number,   :price_category, :price_method, :reference_number, :second_name, :meals_attributes, :registrations_attributes, :children_attributes

validate :first_name, :second_name, :home_country, :email_address, :payment, :price_method, :presence => true

accepts_nested_attributes_for :meals, :allow_destroy => true, :reject_if => proc { |attributes| attributes['meal_type'].blank? }
accepts_nested_attributes_for :registrations, :allow_destroy => true
accepts_nested_attributes_for :children, :allow_destroy => true
这是主表格中的儿童部分

<h2>Children</h2>
 <%= f.fields_for :children do |builder| %>
  <%= render "child_fields", :f => builder %>
 <% end %>
 <%= link_to_add_fields 'Add Children', f, :children %>
儿童
建筑商%>
孩子在田里吃饭

 <fieldset>
  <div class="field">
   <%= f.label :name %><br />
   <%= f.text_field :name %>
  </div>
  <div class="field">
   <%= f.label :age %><br />
   <%= f.number_field :age %>
  </div>
  <div class="field">
   <%= f.label :language %><br />
   <%= f.text_field :language %>
  </div>
  <div class="field">
   <%= f.label :child_care %><br />
   <%= f.check_box :child_care %>
  </div>
  <h3>Child's meals</h3>
  <table>
  <tr>
  <th>Date</th>
  <th>Food type</th>
  <th>Meal type</th>
  </tr>
  <% @meal_dates.each do |meal_date| %>
    <%= f.fields_for :meals do |f3| %>
    <tr>
    <td><%= f3.text_field :meal_date, :value => meal_date %></td>
    <td><%= f3.hidden_field :food_type, :class => 'FoodType', :value => 'vegetarian'%></td>
    <td><%= f3.select(:meal_type, [['Lunch', 1], ['Three Meals', 3], ['None', nil]]) %></td>
    </tr>
    <% end %>
  <% end %>
  </table>

  <%= f.hidden_field :_destroy %>
  <%= link_to "remove", '#', class: "remove_fields" %>
  </fieldset>





儿童餐 日期 食物类型 膳食类型 用餐日期%> “FoodType”,:value=>“素食者”%>

您可以在我的github中找到完整的代码:

IMO建模中有点混乱

与常识不同的是,用餐模式实际上是一种秩序。考虑到这一点,我基本上可以理解逻辑

为了解决您的问题,我建议在用餐(订单)模型中添加一个字段。这块地是用来储存谁将吃这顿饭的。该名称可以是who、
eater
或任何可以理解的名称

此字段的默认值为0,这意味着这顿饭是为此人自己准备的。(为什么不是此人的id?因为您需要使用此字段搜索儿童id。此人的id已存储在订购方中)

当一个人点餐时,他会看到一个选项(收音机或选择),问他这顿饭是给谁的。该选项将填充ID或其子项以及他本人(作为0)

在处理表单时,如果选项值大于0,则表示孩子的id。然后您可以相应地处理它


要显示孩子的膳食,只需使用孩子的id查询餐桌。

事实上,问题不在于谁会吃这顿饭,因为从组织者的角度来看,这并不重要。相反,我不能保存一个膳食模型实例,如果它位于子字段\u for部分下,因为质量分配错误。@szabcsee,很容易解决质量分配错误,只需将此字段添加到模型中可访问的attr\u中即可。对于造型,你决定,我只是觉得有点不真实。如果你检查一下,它已经添加到那里了。与此同时,我转向了儿童和人的多态分配。@szabcsee,似乎没有儿童模型?为什么膳食没有分配给儿童?
<h2>Children</h2>
 <%= f.fields_for :children do |builder| %>
  <%= render "child_fields", :f => builder %>
 <% end %>
 <%= link_to_add_fields 'Add Children', f, :children %>
 <fieldset>
  <div class="field">
   <%= f.label :name %><br />
   <%= f.text_field :name %>
  </div>
  <div class="field">
   <%= f.label :age %><br />
   <%= f.number_field :age %>
  </div>
  <div class="field">
   <%= f.label :language %><br />
   <%= f.text_field :language %>
  </div>
  <div class="field">
   <%= f.label :child_care %><br />
   <%= f.check_box :child_care %>
  </div>
  <h3>Child's meals</h3>
  <table>
  <tr>
  <th>Date</th>
  <th>Food type</th>
  <th>Meal type</th>
  </tr>
  <% @meal_dates.each do |meal_date| %>
    <%= f.fields_for :meals do |f3| %>
    <tr>
    <td><%= f3.text_field :meal_date, :value => meal_date %></td>
    <td><%= f3.hidden_field :food_type, :class => 'FoodType', :value => 'vegetarian'%></td>
    <td><%= f3.select(:meal_type, [['Lunch', 1], ['Three Meals', 3], ['None', nil]]) %></td>
    </tr>
    <% end %>
  <% end %>
  </table>

  <%= f.hidden_field :_destroy %>
  <%= link_to "remove", '#', class: "remove_fields" %>
  </fieldset>