22

这是父模型:

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 和 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

一切都按预期工作;大部分的时间。但是,有时表单中子行的顺序在保存后会变得混乱。顺序在此应用程序中很重要,这就是为什么我在控制器的私有方法中明确执行此排序的原因。

我正在使用“茧”宝石添加删除子记录。我不确定为什么这个订单有时会搞砸。

很抱歉这么长的帖子,但我想预先提供所有相关的细节。

感谢任何指针。

巴拉特

4

3 回答 3

55

我将以更通用的方式向您解释。假设您有 Product 和 Order 模型:

= 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|

如您所见,作为has 方法f块参数的变量。这是您的@product,因此您可以通过获取其订单,然后通过应用所需的排序(对于这个小小的混乱,抱歉:订单/订单)。form_forobject.orders.order(:name)

您可以将排序顺序作为fields_for.

PS您使用 simple_form gem 不会影响我的解决方案。如果您将“simple_”添加到助手中,它将起作用。只是希望我的回答对其他人更有帮助,而不是太与任务相关。

于 2012-05-08T20:39:53.750 回答
1

如果您使用的是 Rails 2.3.14 或更早版本,则必须使用:

f.fields_for :orders, f.object.orders.all(:order => :name) do |order_fields|
于 2013-07-30T04:11:12.167 回答
1

我用这种方式:

class League < ActiveRecord::Base
  has_many :rounds, -> { sort_by_number }, dependent: :destroy
end

class League::Round < ActiveRecord::Base
  belongs_to :league
  scope :sort_by_number, -> { order('league_rounds.number ASC') }
end

在视图中

= form_for league do |f|
  = f.fields_for :rounds do |round_form|
    # Here rounds are sorted by sort_by_number

这种方法允许使用模型中定义的任何范围。这种方法允许创建几个不同排序的关联。

于 2022-02-16T11:46:35.873 回答