Я пытаюсь внедрить в свой проект функцию (вроде сайта социальной сети), которая может быть либо базовой, либо сложной, и я не уверена, что мне придется вечно изобретать велосипед или просто go по сумасшедшей касательной, которая не сработает. Мне просто нужно «зарегистрироваться», так сказать.
Я собираюсь использовать терминологию Facebook в качестве примера, чтобы упростить концепцию, но реализовать аналогичные функции с разными именами. В Facebook у вас есть Pages
и Groups
, которые похожи, но имеют небольшие различия (с этого момента я буду называть коллекцию этих DataSets
). Оба из них могут иметь несколько admins
или followers
, которые все User
ролей, и каждый User
может иметь роли для нескольких Groups
и нескольких Pages
(одна роль на Group
или Page
). Затем, например, вы можете щелкнуть по раскрывающемуся списку, чтобы изменить свой аккаунт на Page
, для которого вы admin
.
По сути, концепция, которую я описываю, заключается в том, что один User
может иметь role
для нескольких различных типов DataSets
. Например, один User
может следовать за 30 различными Pages
и 10 различными Groups
и быть администратором для одного Group
и двух Pages
. Принадлежит ли концепция, которую я описываю, определенной концепции или шаблону разработки программного обеспечения? Мне действительно трудно описать эту функцию без использования примеров Facebook.
У меня есть стратегия для реализации этого типа функциональности в Rails, но я чувствую, что использование этой стратегии усложнит проблему, чем она есть. и есть причудливый способ сделать это, или драгоценный камень, но я просто не знаю, как его исследовать из-за отсутствия терминологии для описания моей проблемы.
Текущая стратегия:
У меня есть Users
столик от Devise. Pages
и Groups
являются индивидуальными моделями и имеют свои таблицы. У меня есть соответствующие таблицы базы данных, чтобы установить отношения «многие ко многим» между Pages
и Users
, наряду с Groups
и Users
(например, 3 столбца, столбец для user_id, столбец для page_id и тип отношения, такие как admin
или follower
). Давайте назовем их Group_User
и Page_User
. В данный момент я проявляю гибкость, так как могу добавить еще DataSets
аналогично Page
и Group
.
Затем для таблицы Devise User
у меня есть два дополнительных столбца для отслеживания DataSet
, для которого Пользователь является администратором и в настоящее время публикует как. Один столбец предназначен для типа DataSet
, а другой - для идентификатора для этого экземпляра (например, [Group, 1] хранится в этих двух столбцах для представления группы с group_id: 1, а [Page, 3] используется для представления страницы с помощью PAGE_ID: 3). Эти два столбца можно проверить при отображении параметров, относящихся к admins
, в которых Group
/ Page
, и простой выпадающий список в верхней части сайта изменяет значения в этих столбцах на любой из Pages
/ * 1055. * зарегистрированный User
является admin
для. Таким образом, один User
логин может взять на себя множество admin
ролей и легко переключаться между ними по мере необходимости.
Есть ли лучший способ сделать это в Rails, такой как gem или конкретный c шаблон проектирования? Или я нахожусь на пути к реализации этих функций самостоятельно? Я думаю, что понимаю проблему, но мое решение кажется простым / необработанным и, возможно, может иметь непредвиденные последствия в будущем (например, кажется, что база данных интенсивна).
Одним из способов, которым я думал об этом, было создание задачи, включающей методы построения отношений и передачи имени DataSet
в качестве аргумента, просто я не переписываю те же методы для Pages
, затем Groups
, затем все, что будет дальше.
Я смотрел на другие решения, такие как polymorphi c typing (что, на мой взгляд, хорошо, если у каждого пользователя только одна роль или только управляемые отношения для одна группа или одна страница) и наследование одной таблицы (но я думаю, что мои Pages
и Groups
могут быть слишком разными, чтобы это работало). Я тоже думал об использовании наследования (например, родитель для обоих Group
и Page
), но я не уверен, что это сильно помогает.
Я просто парень, который изучал слишком много компьютерных наук и недостаточно программировал. Любые советы о том, как упростить эту проблему или просто «да, это сработает», были бы очень полезны!