2016-06-06 5 views
0

ComponentItems 테이블을 통해 Items와 해당 구성 요소 사이에 has_many 연결이 있습니다. ComponentItems에는 item_idcomponent_id 외에도 quantity 열이 포함되어 있습니다. 각 폼의 숫자를 item에 필요한 component 수량을 나타내는 number_field를 어떻게 추가 할 수 있습니까? 관계가없는 경우에도 (즉, @item.component_ids.empty? == true) 양식에 데이터베이스의 각 항목에 number_field가 있어야합니다.레일 4는 추가 열을 통해 has_many를 설정합니다.

class Item < ActiveRecord::Base 
    has_many :components, through: :component_items 
    has_many :component_items 
end 

class Component < Item 
    has_many :items, through: :component_items 
    has_many :component_items 
end 

class ComponentItem < ActiveRecord::Base 
    belongs_to :item 
    belongs_to :component 
end 

저는 올바른 모델을 제외한 모델, 컨트롤러 및 form_builder의 모든 순열을 시도했다고 생각합니다.

아래의 답변에 대한 응답으로 하나의 특정 항목을 구성하는 구성 요소 항목의 확인란과 항목 코드가 표시된 양식이 있습니다.

<%= 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 %> 

따라서 check_box를 quantity_field로 바꾸는 것이 이상적입니다. 방법?

답변

0

그래서 내가 원했던 것이 결국 간단하지 않은 것 같습니다. 결국 별도의 폼을 통해 아이템에 추가 컴포넌트를 추가하기 위해 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 %> 

및 항목 모델 component_items에 대한 중첩 된 속성을 받아 보장. 마지막으로, ... items_controller.rb 여러 component_items의 중첩 PARAMS 배열을 추가

def item_params 
    params.require(:item).permit(
     :component_items_attributes =>[:component_id, :item_id, :quantity, :id] 
    ) 
    end 

주 나는 전혀 이해가되지 않은 여분의 component_items_attributes 배열을 생성하는 것 같았다 fields_for를 사용하지 않았다.

0

이 작동합니다 :

@item.components.to_a.sum(&:quantity) 

이 오류가 발생합니다 일부 구성 요소의 수량이 전무 경우, 당신이 오류를 방지하기 위해이 같은 시도 할 수 있도록 :

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

UPDATE를

<% @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 %> 
+0

i.component_items.to_a.map (& : 수량)'은 각 구성 요소 항목에 대한 수량 배열을 제공하지만 양식 생성에 도움이되지 않습니다. 질문에 예제를 추가했습니다. – mvanio

+0

죄송합니다. 정확히 무엇이 필요한지 이해하지 못했습니다. item.components의 모든 구성 요소에 대한 수량 번호를 표시 할 필드가 필요합니다. 맞습니까? –

+0

거의. 모든 품목에 대해 수량을 표시해야합니다. 구성 요소의 경우이 값은 1 이상이어야하고 다른 항목의 경우 0이어야합니다. – mvanio

관련 문제