0

tl, dr:是否有可能填充三元关联accepts_nested_attributes并因此通过此 PR的测试?

基本上我创建了四个模型A,和B,后者是一个连接表,用于与其他模型建立三元关联。问题是使用我似乎无法保存整个三元关联。相反,我要么创建两个具有二进制关联(AB、BC 或 AC)的连接模型,要么数据库抱怨缺少外键。检查此测试和代码:CAbcaccepts_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 只能在两个模型之间创建关联,而三元模型缺少一个关联。

如您所见,我已将问题隔离为存储库的拉取请求

4

0 回答 0