我在使用ruby on rails的多对多关系表面临问题。
我有两个表和一个关系表(这是一个连接表)。它们命名为以下
我的问题是我如何更新第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;
答案 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)
我找到了一种在第三个关系表上进行更新的方法,如下面的代码,
这是我写的代码
@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