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