我正在尝试找到一种对我来说并不那么明显的导轨设计的解决方案.一个对这些东西非常好的朋友给了我他的看法,但我想知道是否有一个铁轨模式 - 我缺少的知识是铁轨如何创造关系......
我有这样的问题空间.用户可以在多个组织中执行多个角色.因此,例如,用户可以是组织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
Run Code Online (Sandbox Code Playgroud)
我得到(正如你所料)两个组织,并且两个用户都注册了.
缺少的是角色.我有一个新模型(使用通过赋值),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, …Run Code Online (Sandbox Code Playgroud)