更新“多对多”关系表上的值

时间:2016-10-25 11:56:23

标签: mysql ruby-on-rails ruby

我在使用ruby on rails的多对多关系表面临问题。

我有两个表和一个关系表(这是一个连接表)。它们命名为以下

  1. 用户
  2. 作用
  3. ROLE_USER
  4. 我的问题是我如何更新第3个表上的用户角色的值。

    实施例

    如果我指定了

    user_id 34到admin(role_id = 2)

    user_id 34到主管(role_id = 3)

    我应该在Role_User表上有两个条目。现在我想将user_id 34更新为admin(role_id = 1)如何在rails上执行此操作

    我已使用update_all命令在轨道上更新用户详细信息,如下所示

    @user = User.where(id: user_params[:id]);
    @user.update_all(
        first_name: user_params[:first_name],
        last_name: user_params[:last_name],
        email: user_params[:email],
        contact_number: user_params[:contact_number],
        user_name: user_params[:user_name],
        password: user_params[:password]
    );
    

    我尝试使用以下代码更新用户的角色,但失败了

    @roles = user_params[:roles];
    for role in @roles
      @user.roles << Role.find(role)
    end
    
    @user.save;
    

3 个答案:

答案 0 :(得分:1)

您应该能够做到这样的事情:

role = Role.find(ID)
user.roles << role
user.save

答案 1 :(得分:0)

如果您通过rails设置了many_to_many连接,例如,如下所示,那么您不必触摸关系表。正如nifCody所说,你只需告诉rails你附加到用户的角色并且(只要你有正确的关联)rails会自动为你更新中间表。

class User < ApplicationRecord has_many :user_roles has_many :roles, through: :user_roles end

class UserRole < ApplicationRecord belongs_to :user belongs_to :role end

class Role < ApplicationRecord has_many :user_roles has_many :users, through: :user_roles end

但基本上,表格中的任何内容都是rails看到的。因此,如果表中已有数据,则可以保留并继续使用nifCody建议的方法。这只是修改数据的另一种方式,而不是访问

答案 2 :(得分:0)

我找到了一种在第三个关系表上进行更新的方法,如下面的代码,

  1. 首先,我删除特定user_id的所有role_id
  2. 然后将角色作为新内容插入特定的user_id
  3. 这是我写的代码

    @user = User.find(user_params[:id])
    @roles = @user.roles.all
    
    @roles = @user.roles.all
    for role in @roles
      if role
        @user.roles.delete(role)
      end
    end
    
    @user = User.find(user_params[:id])
    @roles = user_params[:roles];
    for role in @roles
      @user.roles << Role.find(role)
    end
    
    if @roles
      @user.save
    end