Como manter a ordenação de atributos aninhados ao usar accept_nested_attributes_for em um aplicativo Rails
Aqui está o modelo pai:
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
Aqui está o modelo aninhado:
class TypeWellPhase < ActiveRecord::Base
belongs_to :type_well
belongs_to :phase
end
Aqui está o modelo da fase:
class Phase < ActiveRecord::Base
...
has_many :type_well_phases
...
end
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:
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
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:
= 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
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