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