ruby-on-rails – 在Rails应用程序中使用accept_nested_attributes_for时如何维护嵌套属性的排序

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 在Rails应用程序中使用accept_nested_attributes_for时如何维护嵌套属性的排序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是父模型:
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_”,它将工作.只是希望我的答案对别人更有帮助,而不是任务相关.

猜你在找的Ruby相关文章