Во время воскресного ночного футбола мы открываем холодные бокалы с ребятами, нашими друзьями. Другими словами, мы взаимодействуем с нашими друзьями. Практически каждое приложение для социальных сетей, которое когда-либо существовало, имеет ту или иную форму взаимодействия между пользователем и его друзьями. Вы можете писать им сообщения, играть с ними в игры, отмечать их в сообщениях или добавлять новых друзей… но что на самом деле происходит на задней стороне? С точки зрения рельсов, вы можете использовать самореферентные таблицы.
Что такое самонаправляющие таблицы?
Возьмем мой предыдущий пример с воскресным ночным футболом; мы взаимодействуем с друзьями, верно? Но слово «друг» — это слово, которое мы используем для объяснения отношений между двумя людьми. Это основа самореферентных таблиц. У пользователя_много друзей, но в техническом смысле у пользователя_много других пользователей. Поначалу самореферентные таблицы очень запутанны, поэтому я приведу несколько примеров того, как этот танец данных выглядит на бэкенде.
Модели, сериализаторы и контроллеры… о боже!
Для самоссылающейся таблицы нам нужны две модели (в данном примере предполагается, что это приложение для социальных сетей): Пользователи и отношения: друзья. Через эту таблицу друзей вы сможете связывать пользователей различными способами. В этом примере мы рассмотрим следующую систему. Взгляните на модель User.rb из моего недавнего проекта:
User.rb has_many catpanions — так называется самореферентная таблица, соединяющая пользователей. Так что же это за has_many :friends, through: :catpanions
бизнес? Что ж, давайте теперь посмотрим на модель Catpanions.rb:
Итак, catpanion принадлежит_пользователю, но также принадлежит_другу. Мы не создали модель друзей, так что же здесь происходит? По сути, мы сказали Ruby, что есть другие экземпляры, называемые друзьями, которые на самом деле являются просто экземплярами класса User. Теперь нам нужны наши foreign_keys.
Эти идентификаторы доступны, потому что мы объявили наши отношения при создании ресурсов:
Когда все готово, чтобы создать дружбу между двумя пользователями, нужно создать маршрут в контроллере, работающем с таблицей ссылок на себя.
Когда мы получаем этот маршрут, мы говорим движку сначала проверить, существует ли пользователь, которого мы пытаемся добавить, в наших дружеских отношениях. Если да, то выдает ошибку. Если нет, у вас есть новый друг! Параметрами, используемыми для создания, должны быть идентификатор пользователя и идентификатор друга. Если вы создадите маршрут, который покажет все дружеские отношения, он должен выглядеть примерно так:
Помните, что user_id — это текущий пользователь, а friend_id — это человек, за которым он следил. Для последних штрихов нам нужен способ доступа к людям, за которыми мы следили, верно? В сериализаторе пользователя добавьте атрибут :friends
:
Теперь, если мы посмотрим на конкретного пользователя, наши данные будут отражать его дружбу с пользователями, за которыми он следил:
Такие данные могут быть чрезвычайно полезны при установлении определенной формы связи между пользователями. Если вы чувствуете себя немного подавленным, не волнуйтесь, мне пришлось несколько дней играть с этой концепцией, чтобы почувствовать себя достаточно комфортно, чтобы использовать ее в проекте!