2010-10-24 32 views
1

用户可以有许多角色,但每个品牌只有一个角色。在Rails中可以使用这种方式建立3向关系吗?

Class User < AR::Base 
    has_and_belongs_to_many :roles, :join_table => "user_brand_roles" 
    has_and_belongs_to_many :brands, :join_table => "user_brand_roles" 
end 

这个设置的问题是,如何在同一时间检查品牌和角色?

或者我最好用BrandRole模型为每个品牌设置不同的角色,然后能够将用户分配到BrandRole?

类用户< AR ::基地 的has_many:user_brand_roles 的has_many:brand_roles,:通过=>:user_brand_roles 端

类BrandRole < AR ::基地 belongs_to的:品牌 belongs_to的:角色 端

Class UserBrandRole < AR :: Base belongs_to:brand_role belongs_to:用户 结束

这样我可以做一个找上了品牌,为用户:

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

这是一个新的应用程序,我试图从过去的错误中学习,并坚持Rails的方式。我在这里做出任何错误的假设或设计决定吗?

+0

首先请描述你所要完成的,因为它听起来并不像您了解如何创建关联的东西。那么它会更容易帮助你:) – s84 2010-10-24 18:53:01

+0

谢谢山姆。我理解Rails中的关系,但我认为我的困惑程度是在此之前的一步。我不知道我是否在问正确的问题。我试图设置一种情况,用户可以通过一定的权限访问站点的受保护区域。一家公司有几个品牌,每个品牌都包含多种产品。一些员工只需要看到品牌内的产品的一般信息,有些需要管理员级的访问权限。 – AKWF 2010-10-24 19:42:05

回答

1

假设角色,品牌是参考表。您可以拥有单个关联表职责与列user_id,role_id,brand_id。 然后你可以定义

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 

的,你可以定义

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

[不知道责任是在您的域名使用的术语,但使用的与其说这是user_brand_role域项]

0

这是一个概念性的东西。如果BrandRole是您的应用程序的实体,那么您的方法应该可行。如果BrandRole不是一个实体本身在你的应用程序,那么也许你可以创建一个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 
相关问题