So behalten Sie die Reihenfolge für verschachtelte Attribute bei, wenn accept_nested_attributes_for in einer Rails-Anwendung verwendet wird
Hier ist das übergeordnete Modell:
<code>class TypeWell < ActiveRecord::Base ... has_many :type_well_phases, :dependent => :destroy accepts_nested_attributes_for :type_well_phases, :reject_if => lambda { |a| a[:phase_id].blank? }, :allow_destroy => true ... end </code>
Hier ist das verschachtelte Modell:
<code>class TypeWellPhase < ActiveRecord::Base belongs_to :type_well belongs_to :phase end </code>
Hier ist das Phasenmodell:
<code>class Phase < ActiveRecord::Base ... has_many :type_well_phases ... end </code>
Ich füge verschachtelte Datensätze in die untergeordnete Tabelle (TypeWellPhases) ein, indem ich ALLE Datensätze aus meiner Phasentabelle (Phasenmodell) in den Controller des übergeordneten Modells kopiere, wie unten gezeigt:
<code>class TypeWellsController < ResourceController ... def new @new_heading = "New Type Well - Computed" @type_well = TypeWell.new initialize_phase_fields end private def initialize_phase_fields Phase.order("id").all.each do |p| type_well_phase = @type_well.type_well_phases.build type_well_phase.phase_id = p.id type_well_phase.gw_heat_value = p.gw_heat_value end end ... end </code>
Ich mache das, weil ich eine bestimmte Reihenfolge nach den hinzugefügten untergeordneten Feldern beibehalten möchte. Der Teil des Codes Phase.order ("id") ist dafür vorgesehen, da die Phasentabelle diese Datensätze in einer bestimmten Reihenfolge enthält.
Danach benutze ich die Hilfsprogramme simple_form_for und simple_fields_for, wie unten in meinem Teilformular gezeigt:
<code>= simple_form_for @type_well do |f| ... #type_well_phases = f.simple_fields_for :type_well_phases do |type_well_phase| = render "type_well_phase_fields", :f => type_well_phase </code>
Alles funktioniert wie gewünscht; meistens. Es kann jedoch vorkommen, dass die Reihenfolge der untergeordneten Zeilen im Formular nach dem Speichern nicht mehr stimmt. Die Reihenfolge ist in dieser Anwendung wichtig, deshalb führe ich diese Bestellung explizit in der privaten Methode im Controller durch.
Ich benutze den Edelstein "Kokon", um das Entfernen von Kindereinträgen hinzuzufügen. Ich bin mir nicht sicher, warum diese Bestellung manchmal durcheinander gebracht wird.
Tut mir leid für einen so langen Beitrag, aber ich wollte alle relevanten Details vorab bereitstellen.
Schätzen Sie alle Hinweise.
Bharat