【问题标题】:Adding a second object to join model from controller添加第二个对象以从控制器加入模型
【发布时间】:2016-02-03 22:09:37
【问题描述】:

UserCompany 之间存在多对多关系,模型 UserCompany 加入了这些关系。当我建立一个新用户的时候,我也建立了一个公司,使用我的users_controller,如下:

class UsersController < ApplicationController

    def new
        @user=User.new
        @company=@user.user_companies.build.build_company
    end

    def create
        @user = User.new(user_params)
        if @user.save
            # @user.companies << @company
            redirect_to users_admin_path(@user), notice: "User successfuly created!"
        else
            redirect_to welcome_index_path
        end
    end

end

上面的代码构建并保存了一个新用户和该用户拥有的新公司,从而在 user_companies 数据库中创建了一个新条目。

问题:我想知道如何将第二个条目添加到此联接模型中,以供第二个已经存在的用户(称他为@user2)使用。所以我希望创建一个新对象@user2.user_companies 并在控制器中设置其属性(:user_id、:company_id 和:company_role)。也许是这样的:

UserCompany.new(company_id: @company.id, user_id: "2", company_role:"owner")

这如何实现?

【问题讨论】:

  • 也许您对 M2M 连接表(和模型)的作用有些困惑? user_companies 表用作单个用户和公司之间的链接。所以不会有两个用户拥有相同的 UserCompany。
  • 您可以破解它并添加另一个与UserCompany 的关系,但这很可能不是您真正想要的。
  • @max 是的!就是这样! (第二条评论)当我创建新用户时,如何在连接表中为已经存在的用户创建第二行?
  • 你的问题没有真正的意义。如果您执行@user = User.create; @user2 = User.create,它将在users 表中插入两个不同的行。如果您执行@user.companies &lt;&lt; @company; @user2.companies &lt;&lt; @company,您会看到它将在user_companies 中插入两个不同的行,它们都指向相同的company_id 但不同的user_id。

标签: ruby-on-rails ruby-on-rails-4 inner-join rails-activerecord


【解决方案1】:

设置第一个用户非常简单:

@user = User.new(user_params)
@company = Company.new(name: 'Acme')
UserCompany.create(user: @user, company: @company, company_role: "owner")

如果您还希望 current_user@company 关联,您只需创建另一个 UserCompany

UserCompany.create(
   user: current_user, 
   company: @company, 
   company_role: "some other role"
)

那么如果你查询@company.users你会得到:

id | name
1  | admin
2  | new user

查询@company.user_companies会得到:

id | user_id | company_id | company_role
1  | 2       | 1          | "owner"
2  | 1       | 1          | "some other role"

【讨论】:

  • 嗨,Max,感谢您的回复。我想我的问题可能没有说清楚。 @user 在连接模型中创建一个条目没有问题。我的目标是为另一个特定的、已经存在的用户(叫他@user2)创建一个第二个连接模型条目。我该怎么做?
  • 我重读了我的问题,但肯定不清楚。我已经在上面更新了它以反映我在评论中描述的内容。很抱歉造成混乱。
【解决方案2】:

您可以将属性传递给build 方法,它们将自动设置在正在构建的新记录上:

假设您有一家现有的公司 @company,并且您想将 @user 添加到该公司的所有者角色中:

user_company = @user.user_companies.build(company: @company, company_role: "owner")

如果是公司has_many :user_companies,你也可以反过来做,从公司开始:

user_company = @company.user_companies.build(user: @user, company_role: "owner")

您可以在Rails documentation 中找到有关关联和建筑记录的更多详细信息。

【讨论】:

  • 感谢您的回复。我在上面都试过了,但都没有“工作”。在检查开发日志时,尽管来自控制器的属性似乎没有出现在参数中,但没有任何错误。也许对我的问题有些困惑?需要明确的是,问题不在于我无法保存任何 user_companies。这是我试图弄清楚如何手动插入第二个。此外,关联如您所述。
  • 我重新阅读了上面的问题,但不是很清楚。我已经对其进行了修改以更好地描述该问题。很抱歉造成混乱。
猜你喜欢
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 2013-11-24
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多