私にはそれほど明白ではないレール設計の解決策を見つけようとしています。この作業が得意な友人が私に意見をくれましたが、Rails のパターンがあるのではないかと思いました。
このような問題空間があります。ユーザーは、複数の組織で複数の役割を果たすことができます。したがって、たとえば、ユーザーは組織 1 では「標準ユーザー」と「パワー ユーザー」の両方になることができますが、組織 2 では「管理者」になります。
私はDeviseとCanCanを使用しています。多対多の関係を管理するために、Users テーブル、Roles と Organizations テーブル、roles_users テーブルがあります。次に、ユーザーと組織間の M2M を格納する user_organisations テーブルがあります。これはすべて正常に動作します。私がこれをするとき;
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
(ご想像のとおり) 2 つの組織と、両方に登録されたユーザーを取得します。
欠けているビットは役割です。user_org テーブルとロールの間のリンクを意図した新しいモデル (割り当てを使用)、roles_user_orgs があり、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