Jak dołączyć do mutli-role, wielu tabel organizacji w Railsach
Próbuję znaleźć rozwiązanie do projektowania szyn, które nie jest dla mnie takie oczywiste. Przyjaciel, który jest bardzo dobry z tymi rzeczami, dał mi swój pogląd na ten temat, ale zastanawiałem się, czy istnieje wzór szyny - wiedza, której brakuje, to sposób, w jaki szyny tworzą relacje…
Mam taką przestrzeń problemową. Użytkownicy mogą pełnić więcej niż jedną rolę w więcej niż jednej organizacji. Na przykład użytkownik może być zarówno „użytkownikiem standardowym”, jak i „użytkownikiem zaawansowanym” w organizacji 1, ale „administratorem” w organizacji 2.
Używam Devise i CanCan. Mam tabelę Users, Role i tabelę Organizations oraz tabelę roles_users do zarządzania relacją wiele-do-wielu. Następnie mam tabelę organizacji użytkownika, która przechowuje M2M między użytkownikiem a organizacjami. To wszystko działa dobrze. Kiedy to robię;
user = User.new({ :email => '[email protected]',
: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
Dostaję (jak można się spodziewać) dwa orgy, a użytkownik zarejestrowany w obu.
Brakującym elementem są role. Mam nowy model (przy użyciu przypisania), roles_user_orgs, który ma być łącznikiem między tabelą user_org a rolami i przechowywać rolę dla użytkownika przy użyciu klucza podstawowego użytkownika i identyfikatora ról. Ale nigdy nie jest zaludniony. Nie wiem, czy to dlatego, że nie piszę poprawnie wstawki, aby ją wypełnić, czy dlatego, że moje relacje nie są poprawne - lub - ponieważ projekt jest błędny i nie działa w szynach. Prostszym modelem jest użycie org_id w tabeli user_roles, ale nie wiem, jak to wypełnić ……
Oto moje skojarzenia ...
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