【问题标题】:How to join mutli-role, multi organisation tables in Rails如何在 Rails 中加入多角色、多组织表
【发布时间】:2013-05-27 10:49:12
【问题描述】:

我正在尝试找到一个对我来说并不那么明显的导轨设计解决方案。一位对这些东西非常擅长的朋友给了我他的看法,但我想知道是否存在 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 为用户存储角色。但它永远不会被填充。我不知道这是因为我没有正确编写插入来填充它,还是因为我的关系不正确 - 或者 - 因为设计完全错误并且无法在导轨中工作。更简单的模型是在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

【问题讨论】:

    标签: ruby-on-rails database devise cancan


    【解决方案1】:

    我认为你在这里把事情复杂化了。在我看来,您需要一个名为 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))
    

    【讨论】:

    • Mihai 这很好,谢谢,简单多了。只需要掌握 ActiveRecord 的窍门 - 现在我看到了使用两个 args 创建很明显..
    • 我有同样的问题,你能在这里帮忙吗:stackoverflow.com/questions/25985163/…
    • 这样的崩溃!
    猜你喜欢
    • 2016-10-15
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 2013-02-06
    相关资源
    最近更新 更多