如何在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 <'administrator').first user.roles <'PowerUser').first 

我得到(如你所料)两个组织,以及两个用户注册的用户。

缺少的是角色。 我有一个新模型(使用通过赋值),roles_user_orgs,它是user_org表和角色之间的链接,并通过使用user_org的主键和角色id为用户存储角色。 但它从未填充过。 我不知道这是因为我没有正确地编写插入来填充它,或者因为我的关系不正确 – 或者 – 因为设计是完全错误的并且不能在rails中工作。 simper模型是在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表,它应该充当User,Org和Role之间的连接表

 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))