我试着建立一个物体,在一次撞击中有三个关联。如果需要,用户可以选择添加更多的子对象。

class Template < ActiveRecord::Base
  has_many :stacks, dependent: :destroy
  accepts_nested_attributes_for :stacks, allow_destroy: true
end

class Stack < ActiveRecord::Base
  belongs_to :template
  has_many :boxes, dependent: :destroy
  accepts_nested_attributes_for :boxes, allow_destroy: true
end

class Box < ActiveRecord::Base
  belongs_to :stack
  has_many :template_variables, dependent: :destroy
  accepts_nested_attributes_for :template_variables, allow_destroy: true
end

class TemplateVariable < ActiveRecord::Base
  belongs_to :box
end

现在,新模板的控制器如下所示:
def new
  @template = Template.new
  stack = @template.stacks.build
  box = stack.boxes.build
  box.template_variables.build
end

我遇到了一些障碍,让我觉得有更好的方法来做这件事Stack对象下面的对象不会被保存控制器允许所有正确的参数。
params.require(:template).permit(:name,
  stacks_attributes: [:name, :direction, :order, :x, :y, :_destroy],
  boxes_attributes: [:name, :_destroy],
  template_variables_attributes: [:name, :box_name, :designator, :order_index, :_destroy])

可能我的形式只是在必要时呈现的部分,比如:
<%= f.simple_fields_for :stacks do |stack| %>
  <%= render 'stack_fields', f: stack %>
<% end %>

<%= link_to_add_fields '+ stack', f, :stacks %>

后续关系嵌套在其中,如stack_fields部分:
<div style='background: #ccc; padding: 1em;'>
  <%= f.input :name  %>
  <%= f.input :direction %>
  <%= f.input :order %>
  <%= f.input :x %>
  <%= f.input :y  %>
  <%= f.hidden_field :_destroy %>
  <%= link_to 'x', '#', class: 'remove_fields' %>

  <%= link_to_add_fields '+ box', f, :boxes %>

  <%= f.simple_fields_for :boxes do |b| %>
    <%= render 'box_fields', f: b %>
  <% end %>
</div>

所以我的问题是:有没有更好的方法来实现我想要的,而不是像这样上坡作战?比如,也许有一个标准的实践,或者一个宝石,或者一些有助于“深层”对象关系创建的东西?

最佳答案

参数嵌套不太正确,每个对象都必须嵌套在其父对象中。目前它们都嵌套在模板中。尝试:

params.require(:template).permit(:name,
  stacks_attributes: [
    :name, :direction, :order, :x, :y, :_destroy,
    boxes_attributes: [
      :name, :_destroy,
      template_variables_attributes: [
        :name, :box_name, :designator, :order_index, :_destroy
      ]
    ]
  ]
)

一般情况下,建议深度关联仅达到两个级别但有时这是不可避免的。由于不知道数据建模的上下文,因此很难考虑是否可以采用其他方法。

关于ruby-on-rails - Rails:建立深层联系的形式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39030775/

10-11 06:46