【问题标题】:Setting attribute in join model when creating two new parents创建两个新父项时在连接模型中设置属性
【发布时间】:2016-05-04 05:44:49
【问题描述】:

我有两个模型: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 留空。

我该如何添加这些信息?

提前致谢!

【问题讨论】:

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


【解决方案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(而不仅仅是分配一个现有的),您还需要为此传递相应的参数。

【讨论】:

  • 您好 Rich,感谢您的回复。我尝试部署您的技术并遇到错误,类似于您过去帮助我解决的问题 (stackoverflow.com/q/34807228/2540204)。按照您的说明操作后,我收到错误 Unpermitted parameter: companies_users。请注意,这不是companies_users_attributes。有什么想法吗?
  • 想聊天吗?
  • 当然,我刚从这里开始:chat.stackoverflow.com/rooms/101868/…
  • 嗨 Rich,我应用了我们讨论的更改(添加强参数,将 fields_for :companies 放在连接表的 fields_for 下,并重命名模型以遵循约定)。我现在收到错误Unpermitted parameter: company。我不想再问,但有什么想法吗?
  • 我们再去聊天
【解决方案2】:

您可以显式引用连接表...

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    相关资源
    最近更新 更多