Ruby on rails 要设置的Rails 4表单有多个附加列

Ruby on rails 要设置的Rails 4表单有多个附加列,ruby-on-rails,ruby-on-rails-4,has-many-through,Ruby On Rails,Ruby On Rails 4,Has Many Through,我通过一个名为ComponentItems的表在项目及其组件之间建立了很多关联。组件项除了项目id和组件id之外,还包含一列数量。如何在我的表格中添加一个数字字段,显示一个项目所需的每个组件的数量?表单必须包含数据库中每个项目的数字字段,即使不存在任何关系(即@Item.component\u ids.empty?==true) class项

我通过一个名为ComponentItems的表在项目及其组件之间建立了很多关联。组件项除了
项目id
组件id
之外,还包含一列
数量
。如何在我的表格中添加一个数字字段,显示一个
项目所需的每个
组件的数量
?表单必须包含数据库中每个项目的数字字段,即使不存在任何关系(即
@Item.component\u ids.empty?==true

class项
我相信我已经尝试了所有可能的模型、控制器和表单生成器的排列,除了正确的排列

作为对下面答案的回应,这里有一个表单,其中显示了一个复选框和组成一个特定项目的组件项目的项目代码

<%= form_for [@item] do |f| %>
  <%= f.collection_check_boxes :component_items, Item.active.where.not(sku: @item.sku).sort_by{|n| n.sku}, :id, :sku do |b| %>
    <%= b.check_box %> <%= b.label %><br/>
   <% end %>
<% end %>


因此,理想情况下,我会将复选框替换为数量的数字字段。怎么做?

这应该是可行的:

@item.components.to_a.sum(&:quantity)
如果某个组件上的数量为零,这将引发错误,因此您可以这样尝试以避免错误:

@item.components.to_a.map(&:quantity).compact.sum
更新

<% @item.component_items.each do |component_item| %>
  <%= form_for(component_item) do |f| %>
    <div class="field">
      <%= f.label :quantity, 'Quantity' %><br />
      <%= f.number_field :quantity %>
    </div>
  <% end %>
<% end %>



所以我想要的似乎并不那么简单。最后,我选择使用一些jQuery,通过一个单独的表单向条目添加额外的组件。我无法尝试添加/删除组件和调整数量,因此选择为每个用户操作使用单独的表单似乎更简单。这可能不是最方便用户的工作方式,但却是我拥有的最好的方式

为了编辑数量,我做了以下操作:

        <% @item.component_items.each do |x| %>
            <%= hidden_field_tag "item[component_items_attributes][][id]", x.id%>
            <%= label_tag x.component.sku, x.component.sku.upcase, :class=>"col-md-3 control-label" %>
            <%= number_field_tag "item[component_items_attributes][][quantity]", x.quantity, :class=>"col-md-5"%>
        <%end %>

注意:我没有为
使用
字段,它似乎生成了一个额外的
组件项目属性
数组,根本没有任何意义。

I.component项目。to\u.map(&:quantity)
将为每个组件项目提供一个数量数组,但对表单生成没有帮助。我在问题中添加了一个示例。对不起,我不明白您到底想要什么,您想要显示item.components中每个组件的数量编号的字段。components,我说得对吗?差不多。它必须显示每个项目的数量。对于组件,该值至少为1,对于其他项目,该值应为0。是否只需显示此数据?使用表单似乎不是做你想做的事情的正确方式。“数量”字段将用于编辑数量。数量>1表示项目和组件之间的关系。
        <% @item.component_items.each do |x| %>
            <%= hidden_field_tag "item[component_items_attributes][][id]", x.id%>
            <%= label_tag x.component.sku, x.component.sku.upcase, :class=>"col-md-3 control-label" %>
            <%= number_field_tag "item[component_items_attributes][][quantity]", x.quantity, :class=>"col-md-5"%>
        <%end %>
def item_params
    params.require(:item).permit(
      :component_items_attributes =>[:component_id, :item_id, :quantity, :id]
    )
  end