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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage