Как сослаться на профиль пользователя по его ID?

В базе данных моего приложения есть таблица members, где я храню специфичную для приложения информацию о части пользователей. Один из столбцов — discourse_user_id. Я хочу отобразить ссылку на профиль пользователя в Discourse. Возможно ли это сделать, используя только его ID?

Я не храню discourse_user_name, так как пользователь может изменить его, и тогда мне придётся беспокоиться о синхронизации данных.

Единственный способ, который я могу придумать, — сделать API-запрос к /admin/users/<user-id>.json, чтобы получить имя пользователя, но это потребует большого количества запросов на странице индекса, где я отображаю список пользователей со ссылками на их профили.

Единственное другое решение, которое приходит в голову, — создать плагин и добавить маршрут, но это кажется слишком трудозатратным для задачи, о которой, вероятно, уже спрашивали. Поэтому я хотел уточнить, есть ли уже какое-то готовое решение?

Одна из идей — добавить внешний ID в запись пользователя, а затем использовать маршрут /by-external/:external_id. Другой вариант — использовать вебхук для уведомления вашей внешней базы данных при изменении имени пользователя. Третий — просто запретить изменение имён пользователей. При беглом просмотре файла discourse/config/routes.rb я не нашёл маршрута, который использует user_id.

Спасибо @pfaffman, это очень полезно. Я думаю, что использование внешнего ID было бы идеальным решением, так как это также решает ещё одну проблему — ссылку в обратном направлении.

Однако, изучая документацию по API и используя REST-клиент, я не вижу, как обновить это поле. Могу ли я использовать его без включения SSO? (И даже если я включу SSO, смогу ли я обновлять его программно?)

Извините, я не знаю наверняка. Мне придется заглянуть в исходный код.

Нет причин обновлять внешний ключ; ключи не должны меняться.

Другой вариант — полагаться на то, что в обеих системах адрес электронной почты будет одинаковым.

Мне кажется, что вам стоит использовать SSO.

Вы можете попробовать это:

https://SERVER/community/admin/users/list/active.json?filter=email%40hostname.com&show_emails=true

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

Я создал плагин для реализации этой функции:

/user-by-id/123/summary перенаправляет на /u/janedoe/summary и так далее.

Меня всё ещё удивляет, что мне пришлось это делать, но, по крайней мере, это работает!