Използвайте макроси за създаване на методи за асоцииране

За да дадете възможност на потребителите да следват други потребители във вашето приложение Rails, ще трябва да създадете таблица за следвания. Следващата таблица ще бъде таблица за присъединяване, която присъединява таблицата на потребителите към себе си.

Сега, таблица за присъединяване, която присъединява таблица към себе си, е малко умопомрачителна. Следващата таблица със сигурност не може да има две user_id колони. За щастие, Rails е оборудван с възможност за псевдоним на асоциации.Можем да кажем на Rails, че единият ID е за потребителя, който прави следното, а другият е за потребителя, който е следван.

Вижте диаграмата по-долу:

Сега, след като разбираме асоциациите, които възнамеряваме да изградим, нека да започнем.

Създайте таблицата за следване

Във вашия терминал в директория на приложение на Rails изпълнете следния код или нещо подобно, за да добавите следваща таблица към вашата база данни.

rails g model Follow follower_id:integer followed_user_id:integer

Това ще генерира миграционен файл за създаване на таблицата, както и моделния файл, който ще използваме по-късно.

Тук колоната follower_id запазва идентификатора на потребителския екземпляр, който дава на другия потребител следване, докато followed_user_id ще записва идентификатора на потребителя, който е следван.

Уверете се, че сте изпълнили rails db:migrate и проверете дали вашата схема изглежда подобна на тази по-долу.

Концептуално разбиране

Преди да продължим, нека се уверим, че разбирате какво в крайна сметка се опитваме да изградим тук.

Всъщност има две крайни цели при създаването на асоциация между потребители и последователи — първата е даден екземпляр на user да може да извика user.followers, за да види всички техни последователи. Второто е, че потребителят може да се обади на user.followed_users, за да види всички потребители, които следва.

И двете крайни цели изискват процес в две стъпки. 1. Създаване на псевдоним на връзката има-много между таблицата потребители и таблицата следва. 2. Псевдоним на асоциацията has-many-through между потребители и потребители. Това се прави и в двете посоки.

последовател (потребител) -› следва -› follow_users (потребители)

follow_user (потребител) -› следва -› последователи (потребители)

Follow_user има много потребители, които ги следват (последователи), а последователят има много потребители, които те следват (followed_users).

Псевдоним на Асоциацията

Нека свържем следната таблица с таблицата на потребителите. Първо ще установим връзката има-много между followed_user и техните последователи.

Следването принадлежи на потребител (последовател и последван потребител)

Можете да кажете на ActiveRecord да ви позволи да можете да извиквате user.followers или user.followed_users.

Забележка: Ако предоставената от мен конвенция за именуване е объркваща, помислете за преименуване на user.followed_users на нещо като user.users_they_follow или каквото и да е подходящо за вас.

Нека усъвършенстваме ред 3. Тук казваме на Rails да създаде метод на екземпляр, наречен follower, за да върне потребителския екземпляр, който следва някой друг в даден следващ екземпляр.

Редът foreign_key: :follower_id казва на Rails да потърси под атрибута на :follower_id в следващата таблица какъв идентификатор има там. След това взема този идентификатор и разглежда реда class_name: “User”, който казва на Rails да търси в колоната ID на потребителската таблица за дадения идентификатор. Потребителският екземпляр със споменатия идентификатор ще бъде върнат.

По принцип, за да получи последователя, Rails ще вземе follower_id и ще се опита да намери потребителя с този идентификатор.

Ред 6 е за другия потребител — този, който е следван. При даден follow_instance, можем да извикаме follow_instance.followed_user, за да върне потребителския екземпляр за потребителя, следван от първия потребител.

Rails ще погледне в следната таблица под колоната followed_user_id, за да разбере какъв е идентификаторът за потребителския екземпляр, който е последван. След това ще търси въпросния потребител в таблицата с потребители и ще го върне.

Точно както по-рано, Rails основно взема followed_user_id, намира съответния потребител с този ID и го връща.

Потребителят има много последвани

Както при всяка асоциация принадлежи към, има придружаваща асоциация има много при другия модел.

Нека започнем с възможността да видим последователите на потребителския екземпляр. В този случай трябва да кажем на нашия потребител, че има много случаи на следване, където потребителят е този, който е следван. Може би можем да опитаме нещо като създаване на възможност за извикване на user.received_follows, за да получим масив от всички последващи случаи, където ID на потребителя е посочен под атрибута followed_user_id.

Забележка: has_many :follows няма да е достатъчно. Ако се обадите на user.follows, как ще разберете дали потребителят е този, който следва, или този, който е следван?

Нека първо се съсредоточим върху ред 3 – тук създаваме метода на екземпляра на received_follows. Точно както при по-рано, когато пишем опциите foreign_key: :followed_user_id, class_name: “Follow”, ние казваме на Rails да проверява колоната followed_user_id на следващата таблица и да търси следващи случаи, където followed_user_id съвпада с ID на потребителя.

Потребителят има много последователи чрез получени следвания

Нека усъвършенстваме ред 6 сега. Това е мястото, където всичко се събира.

has_many :followers, through: :received_follows, source: :follower

Тук създаваме метод на екземпляр, наречен followers. Обърнете внимание на използването на :received_follows и :follower, които са двата метода, които създадохме по-рано.

При обикновена връзка има-много-през, първо избираме всички екземпляри в таблицата за присъединяване, където е посочен идентификационният номер на нашия екземпляр. Това връща масив от екземпляри в таблицата за присъединяване, които след това съпоставяме към различен екземпляр на модела, като използваме метода на екземпляра, създаден от метода belongs_to.

Тук правим същото нещо – просто казваме на Rails какво представлява таблицата за присъединяване и към какво я съпоставяме.

Частта чрез :received_follows указва, че user.received_follows е екземплярите на таблицата за присъединяване. В действителност той връща масив от последващи случаи, където въпросният потребител е follow_user.

След това Rails картографира последващите екземпляри към съответния им последовател (потребителски екземпляр). Редът от код source: :follower казва на Rails да картографира масива от последващи екземпляри, върнати от received_follows, като извика .follower на всеки един. Това създава масив от потребителски екземпляри, като всички те са последователи на дадения потребител.

Това ще преобразува следващите в потребители, които са дали следване на followed_user. хубаво.

Псевдоним на асоциацията за потребители, които потребителят следва

Както споменахме по-рано, наистина има две крайни цели. Дадохме си възможността да извикаме user.followers, за да получим масив от последователи на потребителя, но какво ще кажете за начин да получите масив от потребителите, които потребителят следва? Също така трябва да установим асоциациите има-много и има-много-чрез и за това.

Концепцията ще остане до голяма степен същата, но колоната и посоченият метод ще бъдат различни.

Нека добавим следното към потребителския модел.

Потребителят има много последователи

За ред 11 използваме макроса has_many, за да създадем метода на екземпляр :given_follows, който ще върне масив от следвания, където потребителят е последователят. Той постига това, като разглежда таблицата за следване (class_name: “Follow”) и търси всички случаи за следване, където :followed_user_id е идентификаторът на потребителя (foreign_key: :followed_user_id).

Потребителят има много последователи чрез дадени последователи

И накрая, ред 14 създава метод на екземпляр за получаване на всички потребители, които потребителят следва. Той изпълнява :given_follows (който създадохме на ред 11), за да получи екземплярите за присъединяване и след това ги картографира, като извика :followed_user (който създадохме във файл our follow.rb на ред 6, вижте по-горе) на всеки екземпляр. Това връща масив от потребители.

Заключение

Трябва да можете да се обадите на user.followers и user.followings сега. Сега можете да използвате тези методи, за да покажете емисия в социални медии или да изчислите последователите на потребителя във вашето приложение.

Благодаря за четенето и приятно кодиране.