2016-06-06 12 views
0

Ich habe eine has_many Zuordnung zwischen Elementen und ihren Komponenten über eine Tabelle namens ComponentItems. ComponentItems enthält eine Spalte quantity zusätzlich zu item_id und component_id. Wie ist es möglich, meinem Formular ein Nummernfeld hinzuzufügen, das die Anzahl der für eine erforderlichen component angibt? Das Formular muss ein Nummernfeld für jedes Element in der Datenbank enthalten, auch wenn keine Beziehung existiert (d. H. @item.component_ids.empty? == true).Rails 4 Formular, um has_many durch zusätzliche Spalte

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 

Ich glaube, ich habe versucht jede Permutation von Modell, Controller und Form_builder möglich, mit Ausnahme der richtigen.

Als Antwort auf die folgende Antwort finden Sie hier ein Formular, das ein Kontrollkästchen und den Artikelcode für Komponentenelemente anzeigt, aus denen ein bestimmter Artikel besteht.

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

Also, idealerweise würde ich die check_box durch ein Nummernfeld für die Menge ersetzen. Wie?

Antwort

0

So scheint es, was ich wollte, ist schließlich nicht so einfach. Am Ende entschied ich mich dafür, einige jQuery zu verwenden, um zusätzliche Komponenten zu Items über ein separates Formular hinzuzufügen. Der Versuch, Komponenten hinzuzufügen oder zu entfernen und die Mengen anzupassen, war mir ein Rätsel. Daher schien es einfacher zu sein, separate Formulare für jede Benutzeraktion zu verwenden. Es ist vielleicht nicht die benutzerfreundlichste Art zu arbeiten, aber es ist das Beste, was ich habe.

Um die Mengen zu bearbeiten, habe ich Folgendes getan;

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

und gewährleistet die Item-Modell verschachtelte Attribute für component_items akzeptiert. Schließlich fügen Sie die verschachtelte params Array für mehr component_items items_controller.rb ...

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

Hinweis habe ich nicht fields_for verwenden, die ein zusätzlichen component_items_attributes Array zu erzeugen schienen, die keinen Sinn ergeben haben.

0

Dies sollte funktionieren:

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

Diese werfen einen Fehler, wenn Menge auf einige Komponente Null ist, so dass Sie wie diese versuchen, Fehler zu vermeiden:

@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 (&: quantity)' gibt ein Array von Mengen für jedes der Komponentenelemente, hilft aber nicht bei der Formulargenerierung. Ich habe der Frage ein Beispiel hinzugefügt. – mvanio

+0

Entschuldigung, ich habe nicht verstanden, was genau Sie wollen, Sie wollen Feld, die Menge Nummer für jede Komponente von item.components zeigen, bin ich richtig? –

+0

Fast. Es muss Menge für jeden Artikel anzeigen. Für Komponenten ist dies mindestens 1, für andere Elemente sollte es 0 sein. – mvanio

Verwandte Themen