可以在Rails中以这种方式建立三向关系吗?

时间:2010-10-24 18:23:49

标签: ruby-on-rails

用户可以拥有多个角色,但每个品牌只有一个角色。

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方式。我在这里做出任何错误的假设或设计决定吗?

2 个答案:

答案 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