我有两个模型:User
和Company
。公司可以拥有许多用户,用户可以拥有许多公司。正如您所建议的,这是使用连接表的最佳位置。我实际上正在使用一个完整的模型来加入User
和Company
,以便我可以指定每个用户拥有的角色。因此,表companies_users
包含以下列:user_id
,company_id
和company_role
。
我正在尝试协商的情况是我正在创建Company
和User
,并希望在执行此操作时指定company_role
。
我的new
方法如下:
def new
@user=User.new
@company=@user.companies.build
end
这会在companies_users
联接表中创建一个条目,但(显然)会将company_role
留空。
我如何添加这些信息?
提前致谢!
答案 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