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