我正在尝试找到对我来说不是那么明显的导轨设计的解决方案。一位对这些东西非常擅长的朋友给了我他的看法,但我想知道是否存在 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