Дизайн «многие ко многим», 2 вида отношений на одних и тех же объектах? - PullRequest
0 голосов
/ 06 июня 2011

Например, один пользователь присоединился ко многим группам, в одной группе много пользователей. Это нормальное отношение «многие ко многим». Однако я хочу идентифицировать пользователей как «участник» и «владелец»: одна группа будет иметь много «владелец» и много «член»; каждый пользователь может быть владельцем или членом группы. В то же время «владелец» также должен быть своего рода «участником». Как мне создать такую ​​структуру таблицы?

У меня нормальное отношение «многие ко многим», подобное этому, в таблице 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 Ответ

1 голос
/ 06 июня 2011

Вам нужны следующие таблицы:

           USERS
           GROUPS
           ROLES
           USERGROUPROLE

Таблица USERGROUPROLE такова:

         userid  references USER
         groupid references GROUPS
         roleid  referencees ROLES

         Primary key (userid, groupid, roleid)

Это позволило бы владельцу группы быть также членом группы. Это позволило бы группе иметь нескольких владельцев и нескольких членов. Группа имеет 0 или более участников; у группы 0 или более владельцев.

Вы могли бы иметь РАЗРЕШЕНИЯ и таблицу ROLEPERMISSIONS для определения полномочий определенных ролей. РОЛЬ имеет 0 или более разрешений.

          ROLEPERSMISSIONS
          roleid references ROLES
          permissionid references PERMISSIONS

Пример разрешения:

         can delete
         can edit
         can create new topic
         can attach file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...