gpt4 book ai didi

ruby-on-rails - 如何在 Rails 中联合多角色、多组织表

转载 作者:搜寻专家 更新时间:2023-10-30 20:02:11 24 4
gpt4 key购买 nike

我正试图找到一种对我来说不是很明显的 rails 设计的解决方案。一位非常擅长这方面的 friend 向我提供了他的看法,但我想知道是否存在 Rails 模式 - 我缺少的知识是 Rails 如何创建关系......

我有这样的问题空间。用户可以在多个组织中担任多个角色。因此,例如,用户在组织 1 中既可以是“标准用户”又可以是“高级用户”,但在组织 2 中可以是“管理员”。

我正在使用 Devise 和 CanCan。我有一个 Users 表、Roles 和一个 Organizations 表以及一个 roles_users 表来管理多对多关系。然后我有一个 user_organisations 表,它存储用户和组织之间的 M2M。这一切正常。当我这样做时;

user = User.new({ :email => 'admin@example.com', 
:password => 'password',
:password_confirmation => 'password',
:firstname => 'TestFirstName',
:surname => 'TestSurName'})

org1 = Org.new({:fullname => 'Test Org 1'})
org1.save

org2 = Org.new({:fullname => 'Test Org 2'})
org2.save

user.org << Org.first
user.org << Org.last

user.roles << Role.where('name'=>'administrator').first
user.roles << Role.where('name'=>'PowerUser').first

我得到(如您所料)两个组织,并且一个用户在这两个组织中注册。

缺少的是角色。我有一个新模型(通过分配使用)roles_user_orgs,它是 user_org 表和角色之间的链接,并通过使用 user_org 的主键和角色 ID 为用户存储角色。但它从未被填充。我不知道这是因为我没有正确编写插入内容来填充它,还是因为我的关系不正确 - 或者 - 因为设计完全错误并且无法在 Rails 中工作。更简单的模型是在 user_roles 表中使用 org_id,但我不知道如何填充它……

这是我的联想...

class Role

has_many :user_roles, :dependent => :destroy
has_many :users, :through => :user_roles, :uniq => true

has_many :role_user_orgs, :dependent => :destroy
has_many :user_orgs, :through => :role_user_orgs


class Org
has_many :user_orgs
has_many :users, :through => :user_orgs

class UserOrg
belongs_to :org
belongs_to :user

has_many :role_user_orgs, :dependent => :destroy
has_many :roles, :through => :role_user_orgs

class UserRole
belongs_to :User
belongs_to :role

class User
has_many :user_roles
has_many :roles, :through => :user_roles
has_many :user_orgs
has_many :orgs, :through => :user_orgs


class RoleUserOrg
belongs_to :role
belongs_to :user_orgs

最佳答案

我认为你在这里把事情复杂化了。在我看来,您需要一个名为 memberships 的表,它应该充当用户、组织和角色之间的连接表

class Membership
belongs_to :user
belongs_to :org
belongs_to :role


class User
has_many :memberships
has_many :orgs, through: :memberships
has_many :roles, through: :memberships

要为组织内的用户创建新角色,只需执行以下操作:

org = Org.create({:fullname => 'Test Org 1'})
role = Role.where('name'=>'administrator').first
membership = user.memberships.create(org_id: org.id, role_id: role.id)

要查询组织内的角色,您可以:

org = Org.where(name: "Test Org").first
my_roles = Role.find(user.memberships.where(org_id: org.id).map(&:role_id))

关于ruby-on-rails - 如何在 Rails 中联合多角色、多组织表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16771503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com