Como manter a ordenação de atributos aninhados ao usar accept_nested_attributes_for em um aplicativo Rails

Aqui está o modelo pai:

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

Aqui está o modelo aninhado:

<code>class TypeWellPhase < ActiveRecord::Base

  belongs_to :type_well
  belongs_to :phase

end
</code>

Aqui está o modelo da fase:

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

Eu adiciono registros aninhados na tabela filho (TypeWellPhases), copiando todos os registros da minha tabela de fases (modelo de fase) no controlador do modelo pai, conforme mostrado abaixo:

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

Eu faço isso porque quero manter uma ordem específica pelos campos filhos que são adicionados. A parte do código Phase.order ("id") é para isso, pois a tabela de fases possui esses registros em uma ordem específica.

Depois disso, eu uso os helpers simple_form_for e simple_fields_for mostrado abaixo no meu formulário partial:

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

Tudo funciona como desejado; Na maioria das vezes. No entanto, às vezes, a ordenação de linhas filhas no formulário é confusa depois de ter sido salva. A ordem é importante neste aplicativo e é por isso que faço explicitamente essa ordenação no método privado no controlador.

Eu estou usando o gem "casulo" para adicionar a remoção de registros filho. Não sei ao certo por que esse pedido fica confuso às vezes.

Desculpe por um longo post, mas eu queria fornecer todos os detalhes pertinentes na frente.

Aprecie todos os ponteiros.

Bharat

questionAnswers(2)

yourAnswerToTheQuestion