2

私にはそれほど明白ではないレール設計の解決策を見つけようとしています。この作業が得意な友人が私に意見をくれましたが、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
4

1 に答える 1

6

ここで物事を複雑にしすぎていると思います。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))
于 2013-05-27T12:49:53.613 に答える