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

时间:2016-01-27 10:19:03

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord jointable

我有两个模型:UserCompany。公司可以拥有许多用户,用户可以拥有许多公司。正如您所建议的,这是使用连接表的最佳位置。我实际上正在使用一个完整的模型来加入UserCompany,以便我可以指定每个用户拥有的角色。因此,表companies_users包含以下列:user_idcompany_idcompany_role

我正在尝试协商的情况是我正在创建CompanyUser,并希望在执行此操作时指定company_role

我的new方法如下:

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

这会在companies_users联接表中创建一个条目,但(显然)会将company_role留空。

我如何添加这些信息?

提前致谢!

2 个答案:

答案 0 :(得分:1)

您可以通过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,则必须为两者传递参数。虽然看起来很乱,但你所做的只是将每个嵌套对象传递给各自的模型。

如果要设置“角色”,则必须将属性传递给company_users。如果你想创建一个新的company(而不仅仅是分配一个现有的),你也需要传递相应的参数。

答案 1 :(得分:0)

您可以明确引用连接表...

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