親モデルは次のとおりです。
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
以下に示すように、親モデルのコントローラーのフェーズ (Phase モデル) テーブルからすべてのレコードをコピーして、子テーブル (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 および simple_fields_for ヘルパーを使用します。
= 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
すべてが希望どおりに機能します。その時間の大半。ただし、保存後にフォーム内の子行の順序が乱れることがあります。このアプリケーションでは順序が重要であるため、コントローラーのプライベート メソッドでこの順序付けを明示的に行います。
子レコードの削除を追加するために「繭」宝石を使用しています。この順序がときどきめちゃくちゃになる理由がよくわかりません。
このような長い投稿で申し訳ありませんが、関連するすべての詳細を前もって提供したかったのです。
ポインタに感謝します。
バーラト