- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正试图找到一种对我来说不是很明显的 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/
我是一名优秀的程序员,十分优秀!