Jak zachować porządek dla zagnieżdżonych atrybutów podczas używania accepts_nested_attributes_for w aplikacji Rails
Oto model macierzysty:
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
Oto model zagnieżdżony:
class TypeWellPhase < ActiveRecord::Base
belongs_to :type_well
belongs_to :phase
end
Oto model fazy:
class Phase < ActiveRecord::Base
...
has_many :type_well_phases
...
end
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:
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
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:
= 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
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