Jak zachować porządek dla zagnieżdżonych atrybutów podczas używania accepts_nested_attributes_for w aplikacji Rails

Oto model macierzysty:

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

Oto model zagnieżdżony:

<code>class TypeWellPhase < ActiveRecord::Base

  belongs_to :type_well
  belongs_to :phase

end
</code>

Oto model fazy:

<code>class Phase < ActiveRecord::Base
  ... 
  has_many :type_well_phases
  ...
end
</code>

Dodajemy zagnieżdżone rekordy w tabeli podrzędnej (TypeWellPhases), kopiując WSZYSTKIE rekordy z mojej fazy (model fazy) w kontrolerze modelu macierzystego, jak pokazano poniżej:

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

Robię to, ponieważ chcę zachować określoną kolejność dodanych pól dzieci. Część kodu Phase.order („id”) służy do tego, ponieważ tabela faz zawiera te rekordy w określonej kolejności.

Po tym używam pomocników simple_form_for i simple_fields_ dla pomocników, jak pokazano poniżej w mojej części:

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

Wszystko działa zgodnie z oczekiwaniami; w większości przypadków. Czasami jednak porządkowanie wierszy podrzędnych w formularzu jest pomieszane po zapisaniu. Kolejność jest ważna w tej aplikacji, dlatego wyraźnie robię to w prywatnej metodzie w kontrolerze.

Używam klejnotu „kokonu” do dodawania usuwania rekordów podrzędnych. Nie jestem pewien, dlaczego ten rozkaz czasem się popsuł.

Przepraszamy za tak długi post, ale chciałem przedstawić wszystkie istotne szczegóły z góry.

Doceń wszelkie wskazówki.

Bharat

questionAnswers(2)

yourAnswerToTheQuestion