Как называется эта концепция, которую я реализую, и как это сделать в Rails? - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь внедрить в свой проект функцию (вроде сайта социальной сети), которая может быть либо базовой, либо сложной, и я не уверена, что мне придется вечно изобретать велосипед или просто 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), но я не уверен, что это сильно помогает.

Я просто парень, который изучал слишком много компьютерных наук и недостаточно программировал. Любые советы о том, как упростить эту проблему или просто «да, это сработает», были бы очень полезны!

1 Ответ

1 голос
/ 26 марта 2020

Я думаю, вы отлично справляетесь с дизайном базы данных. Когда-то участвовал в приложении для социальных сетей, подобном вашему, с похожим дизайном. Ваш дизайн кажется намного лучше, чем тот, с которым я работал. На мой взгляд, приложения такого типа должны быть обширными.

В RoR существует несколько шаблонов проектирования. Я активно использую Service Object Pattern для поддержки тонких контроллеров и моделей. Также это помогает мне написать многоразовый класс. Еще один, который мне нравится - это Presenter Pattern для упрощения просмотра.

Подробную информацию можно найти в этом сообщении в блоге , где вы найдете дополнительные идеи шаблонов дизайна.

...