创建两个新 parents 时在连接模型中设置属性
Setting attribute in join model when creating two new parents
我有两个模型:User
和 Company
。一个公司可以有很多用户,一个用户可以有很多公司。正如您可能建议的那样,这是使用连接 table 的最佳位置。我实际上正在使用一个完整的模型来加入 User
和 Company
,这样我就可以指定每个用户拥有的角色。因此 table、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
连接 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
我有两个模型:User
和 Company
。一个公司可以有很多用户,一个用户可以有很多公司。正如您可能建议的那样,这是使用连接 table 的最佳位置。我实际上正在使用一个完整的模型来加入 User
和 Company
,这样我就可以指定每个用户拥有的角色。因此 table、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
连接 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