2

我正在尝试找到对我来说不是那么明显的导轨设计的解决方案。一位对这些东西非常擅长的朋友给了我他的看法,但我想知道是否存在 rails 模式 - 我缺少的知识是 rails 如何创建关系......</p>

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

我正在使用设计和 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 为用户存储角色。但它永远不会被填充。我不知道这是因为我没有正确编写插入来填充它,还是因为我的关系不正确 - 或者 - 因为设计完全错误并且无法在导轨中工作。更简单的模型是在user_roles表中使用一个org_id,但是我不知道如何填充这个……</p>

这是我的联想...

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
4

1 回答 1

6

我认为你在这里把事情复杂化了。在我看来,您需要一个名为的表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))
于 2013-05-27T12:49:53.613 回答