创建两个新 parents 时在连接模型中设置属性

Setting attribute in join model when creating two new parents

我有两个模型:UserCompany。一个公司可以有很多用户,一个用户可以有很多公司。正如您可能建议的那样,这是使用连接 table 的最佳位置。我实际上正在使用一个完整的模型来加入 UserCompany,这样我就可以指定每个用户拥有的角色。因此 table、companies_users 具有以下列:user_idcompany_idcompany_role.

我试图协商的情况是我同时创建了 CompanyUser,并希望在创建时指定 company_role

我的new方法如下:

def new
    @user=User.new
    @company=@user.companies.build
end

这会在 companies_users 连接 table 中创建一个条目,但(显然)这样做会将 company_role 留空。

我该如何添加这些信息?

提前致谢!

您可以通过 build / create 方法传递属性:

#app/controllers/users_controller.rb
class UsersController < ApplicationController
    def new
       @user = User.new
       @user.company_users.build.build_company
    end

    def create
       @user = User.new user_params
       @user.save  
    end

    private

    def user_params
       params.require(:user).permit(company_users_attributes: [company_attributes:[:name]])
    end
end

#app/views/users/new.html.erb
<%= form_for @user do |f| %>
   <%= f.fields_for :company_users do |cu| %>
       <%= cu.text_field :company_role %>
       <%= cu.fields_for :company do |c| %>
          <%= c.text_field :name %>
       <% end %>
   <% end %>
   <%= f.submit %>
<% end %>

上面看起来比较复杂,待会再解释

您需要以下型号:

#app/models/user.rb
class User < ActiveRecord::Base
   has_many :company_users
   has_many :companies, through: :company_users
   accepts_nested_attributes_for :company_users
end

#app/models/company_user.rb
class CompanyUser < ActiveRecord::Base
   belongs_to :company
   belongs_to :user
   accepts_nested_attributes_for :company
end

#app/models/company.rb
class Company < ActiveRecord::Base
   has_many :company_users
   has_many :users, through: :company_users
end

如果您想创建 company company_user,您必须为两者传递参数。虽然它看起来很乱,但您所做的只是将每个嵌套对象传递给它们各自的模型。

如果要设置 "role",则必须将属性传递给 company_users。如果您还想创建一个新的 company(而不是仅仅分配一个现有的),您还需要为此传递相应的参数。

您可以显式引用联接 table...

def new
    @user = User.new
    @company = Company.new
    @companies_user=@user.companies_user.build(company: @company, company_role: 'default role')
end