Cómo mantener el orden de los atributos anidados cuando se utiliza accept_nested_attributes_for en una aplicación de Rails
Aquí está el modelo padre:
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
Aquí está el modelo anidado:
class TypeWellPhase < ActiveRecord::Base
belongs_to :type_well
belongs_to :phase
end
Aquí está el modelo de fase:
class Phase < ActiveRecord::Base
...
has_many :type_well_phases
...
end
Agrego registros anidados en la tabla secundaria (TypeWellPhases) copiando TODOS los registros de mi tabla de fases (modelo de fase) en el controlador del modelo principal como se muestra a continuación:
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
Hago esto porque quiero mantener un orden específico por los campos secundarios que se agregan. La parte del código Phase.order ("id") es para eso ya que la tabla de fases tiene estos registros en un orden específico.
Después de esto, uso los formularios simple_form_for y simple_fields_for helpers como se muestra a continuación en mi formulario parcial:
= 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
Todo funciona como se desee; La mayoría de las veces. Sin embargo, a veces el orden de las filas secundarias en el formulario se confunde después de que se haya guardado. El orden es importante en esta aplicación, por eso hago este pedido explícitamente en el método privado en el controlador.
Estoy usando la gema "capullo" para agregar la eliminación de registros secundarios. No estoy seguro de por qué este orden se confunde a veces.
Lo siento por un post tan largo, pero quería proporcionar todos los detalles pertinentes por adelantado.
Apreciar cualquier punteros.
Bharat