tl, dr:是否有可能填充三元关联accepts_nested_attributes
并因此通过此 PR的测试?
基本上我创建了四个模型A
,和B
,后者是一个连接表,用于与其他模型建立三元关联。问题是使用我似乎无法保存整个三元关联。相反,我要么创建两个具有二进制关联(AB、BC 或 AC)的连接模型,要么数据库抱怨缺少外键。检查此测试和代码:C
Abc
accepts_nested_attributes_for
class A < ApplicationRecord
has_and_belongs_to_many :bs, join_table: :abcs
has_and_belongs_to_many :cs, join_table: :abcs
accepts_nested_attributes_for :bs, :cs
end
class B < ApplicationRecord; end
class C < ApplicationRecord; end
class Abc < ApplicationRecord
belongs_to :a
belongs_to :b
belongs_to :c
end
class AsController < ApplicationController
def new
@a = A.new
@a.bs.build
@a.cs.build
end
def create
@a = A.new(a_params)
if @a.save
redirect_to(new_a_path)
else
render(:new)
end
end
def a_params
params.require(:a).permit(:name, bs_attributes: [:name], cs_attributes: [:name])
end
end
<%= form_for(@a) do |f| %>
<% if @a.errors.any? %>
<ul>
<% @a.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
<% end %>
<%= f.label(:name) %>
<%= f.text_field(:name) %>
<ul>
BS:
<%= f.fields_for(:bs) do |ff| %>
<li>
<%= ff.label(:name) %>
<%= ff.text_field(:name) %>
</li>
<% end %>
</ul>
<ul>
CS:
<%= f.fields_for(:cs) do |ff| %>
<li>
<%= ff.label(:name) %>
<%= ff.text_field(:name) %>
</li>
<% end %>
</ul>
<%= f.submit %>
<% end %>
我也尝试从三元表中创建它,该表适用于模型之间的一个单一关联(ABC),但对于多个(A1-B1-C1,A1-B2-C1)是不可能的。查看代码:
class AsController < ApplicationController
def new
@abc = Abc.new
@abc.build_a
@abc.build_b # 2.times { @abc.build_b } only overwrites @abc.b
@abc.build_c
end
end
似乎无论如何 Rails 只能在两个模型之间创建关联,而三元模型缺少一个关联。
如您所见,我已将问题隔离为存储库的拉取请求