Как поддерживать порядок вложенных атрибутов при использовании accepts _вложенных _атрибутов _для в приложении Rails

Вот родительская модель:

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

Вот вложенная модель:

class TypeWellPhase < ActiveRecord::Base

  belongs_to :type_well
  belongs_to :phase

end

Вот фазовая модель:

class Phase < ActiveRecord::Base
 ... 
  has_many :type_well_phases
 ...
end

Добавляю вложенные записи в дочерней таблице (TypeWellPhases )путем копирования ВСЕХ записей из моих фаз (Фазовая модель )таблицы в контроллере родительской модели, как показано ниже:

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

Я делаю это, потому что я хочу поддерживать определенный порядок с помощью добавляемые дочерние поля. Часть кода Phase.order ("id" )предназначена для этого, так как таблица фаз имеет эти записи в определенном порядке.

После этого я использую простую _форму _для и простые _поля _для хелперов, как показано ниже в моей частичной форме:

= 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

Все работает как надо; в большинстве случаев. Однако иногда после сохранения порядок дочерних строк в форме нарушается. Порядок важен в этом приложении, поэтому я явно делаю этот порядок в приватном методе в контроллере.

Я использую гем "cocoon" для добавления удаления дочерних записей. Я не уверен, почему этот порядок иногда нарушается.

Извините за такой длинный пост, но я хотел предоставить всю необходимую информацию заранее.

Принимайте любые указатели.

Bharat

19
задан Bharat 8 May 2012 в 20:16
поделиться