2011-06-06 104 views
0

例如,一个用户已加入许多组,一个组有许多用户成员。这是一个正常的多对多关系。但是,我想将用户识别为“成员”和“所有者”:一个组将拥有许多“所有者”和许多“成员”;每个用户可以是所有者或组的成员。同时,“所有者”也应该是一种“成员”。我应该如何创建这样的表结构?多对多设计,2种关于同一物体的关系?

我有这样的正常的多对多关系,还有一个字段在:group_user_relations表中标识用户是成员还是所有者。

class User < ActiveRecord::Base 
    # many-to-many to groups 
    has_many :group_user_relations 
    has_many :groups, :through => :group_user_relations 
end 


class Group < ActiveRecord::Base 
    # many-to-many to users 
    has_many :group_user_relations 
    has_many :users, :through => :group_user_relations 
    alias_attribute :members, :users 
end 

回答

1

您需要以下表格:

  USERS 
      GROUPS 
      ROLES 
      USERGROUPROLE 

的USERGROUPROLE表是这样的:

  userid references USER 
     groupid references GROUPS 
     roleid referencees ROLES 

     Primary key (userid, groupid, roleid) 

这将允许一组的所有者是也是该集团的一员。这将允许该组拥有多个所有者和多个成员。一个组有0个或更多成员;一个组有0个或更多的所有者。

您可以通过PERMISSIONS和ROLEPERMISSIONS表来识别特定角色的权限。角色拥有0个或更多权限。

  ROLEPERSMISSIONS 
      roleid references ROLES 
      permissionid references PERMISSIONS 

样品权限:

  can delete 
     can edit 
     can create new topic 
     can attach file 
+0

是的,这是有道理的。非常感谢!! – Ning 2011-06-06 16:08:15

+0

但是例如,Group#members()应该返回此组的所有成员。有没有更简单的方法来做到这一点?我想使用named_scope搜索3个表(用户,组和USERGROUPROLE),有没有更好的方法? – Ning 2011-06-06 16:15:34

+1

@宁:从USERGROUPROLE where roleid =?select distinct userid。 [具有给定角色的所有用户]从usergrouprole中选择userid,roleid,其中groupid =? [所有用户,按角色,在给定组中]。从usergrouprole中选择不同的用户标识,其中groupid =? [给定组中的所有用户]您可能需要向表中添加其他索引以获得良好的响应时间。 – Tim 2011-06-06 16:48:24