这是父模型:
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 model)表中复制所有记录,在子表(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
一切都按照需要工作;大部分的时间.但是,有时,表单中的Child行的排序在保存后会被弄乱.这个顺序在这个应用程序中很重要,这就是为什么我在控制器的私有方法中明确地做这个排序.
我正在使用“茧”宝石来添加删除子记录.我不知道为什么这个订单有时被搞砸了.
对不起这么长的职位,但我想提供所有相关的细节.
欣赏任何指针.
巴拉特
解决方法
我会用更通用的方法来解释你.说,你有产品和订单型号:
= form_for @product do |f| ... = f.fields_for :orders do |order_fields| = order_fields.text_field :name
如果您希望您的订单按名称排序,然后排序:)
代替:
= f.fields_for :orders do |order_fields|
放:
= f.fields_for :orders,f.object.orders.order(:name) do |order_fields|
如你所见,作为form_for块参数的f变量具有方法对象.这是你的@product,所以你可以通过.orders来获取它的订单,然后通过.order(:name)应用所需的排序(对于这个小混乱:订单/订单)).
解决方案的关键是可以将排序顺序作为fields_for的第二个参数传递.
附:您使用simple_form gem不会影响我的解决方案.如果您向帮助者添加“simple_”,它将工作.只是希望我的答案对别人更有帮助,而不是任务相关.