用户可以拥有多个角色,但每个品牌只有一个角色。
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?
类用户&lt; AR :: Base的 has_many:user_brand_roles has_many:brand_roles,:through =&gt; :user_brand_roles 端
Class BrandRole&lt; AR :: Base的 belongs_to:品牌 belongs_to:角色 端
Class UserBrandRole&lt; 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 :(得分: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]
答案 1 :(得分: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