2010-10-24 3 views
1

Un utilisateur peut avoir plusieurs rôles, mais un seul rôle par marque. Le problème avec cette configuration est, comment vérifier la marque et le rôle en même temps? Ou devrais-je mieux avec un modèle BrandRole où différents rôles peuvent être mis en place pour chaque marque, puis être en mesure d'attribuer un utilisateur à un BrandRole?Est-ce qu'une relation à 3 voies peut être modélisée de cette façon dans Rails?

classe utilisateur < AR :: Base has_many: user_brand_roles has_many: brand_roles,: à travers =>: user_brand_roles fin

Classe BrandRole < AR :: Base belongs_to: marque belongs_to: rôle fin

classe UserBrandRole < AR :: base belongs_to: brand_role belongs_to: utilisateur fin

De cette façon, je pouvais faire une découverte sur la marque pour l'utilisateur:

br = current_user.brand_roles.where(:brand_id => @brand.id).includes(:brand_role) 
if br.blank? or br.role != ADMIN 
    # reject access, redirect 
end 

Ceci est une nouvelle application et je suis en train d'apprendre des erreurs du passé et coller à la façon Rails. Est-ce que je fais de mauvaises hypothèses ou des décisions de conception ici?

+0

D'abord s'il vous plaît décrire ce que vous essayez d'accomplir, car il ne semble pas que vous comprenez comment créer des associations. Ensuite, il sera beaucoup plus facile de vous aider :) – s84

+0

Merci Sam. Je comprends les relations dans Rails, mais je pense que mon niveau de confusion est une étape avant cela. Je ne sais pas si je pose les bonnes questions. J'essaie de mettre en place une situation où un utilisateur peut accéder à une zone protégée d'un site avec un certain ensemble d'autorisations. Une entreprise a plusieurs marques, chacune contenant plusieurs produits. Certains employés ont besoin de voir uniquement des informations générales sur les produits au sein d'une marque, certains ont besoin d'un accès de niveau administrateur. – AKWF

Répondre

1

En supposant des rôles, les marques sont des tables de référence. Vous pouvez avoir une seule table d'association Responsabilités avec les colonnes user_id, role_id, brand_id. Ensuite, vous pouvez définir

Class User < AR::Base 
has_many : responsibilities 
has_many :roles, :through => responsibilities 
has_many :brands,:through => responsibilities 
end 
Class Responsibility < AR::Base 
belongs_to :user 
has_one :role 
has_one :brand 
end 

Le vous pouvez définir

Class User < AR::Base 
    def has_access?(brand) 
    responsibility = responsibilities.where(:brand => brand) 
    responsibility and responsibility.role == ADMIN 
    end 
end 

[Je ne sais pas si la responsabilité est le terme utilisé dans votre domaine, mais utiliser un terme de domaine au lieu de l'appeler comme user_brand_role]

0

Ceci est une chose conceptuelle. Si BrandRole est une entité pour votre application, votre approche devrait fonctionner. Si BrandRole est pas une entité en elle-même dans votre application, vous pouvez peut-être créer un modèle UserBrandRole:

class User < AR::Base 
    has_many :user_brand_roles 
end 

class Brand < AR::Base 
    has_many :user_brand_roles 
end 

class Role < AR::Base 
    has_many :user_brand_roles 
end 

class UserBrandRole < AR::Base 
    belongs_to :user 
    belongs_to :brand 
    belongs_to :role 
    validates_uniqueness_of :role_id, :scope => [:user_id, :brand_id] 
end 
Questions connexes