Включение сопутствующих данных в ответ API Sinatra

Я только что завершил разработку Scrum/Kanban-подобного приложения на основе Ruby и React. В этом посте я расскажу об одном из препятствий, с которым я столкнулся при создании контроллера приложения на Ruby.


Доска scrum/kanban (далее мы будем называть ее scrumban) используется командами разработчиков для разбивки проекта на более мелкие части работы, которые могут быть реализованы в течение 2-4 недельных спринтов. Доска scrumban обычно содержит колонки для работ, которые находятся в бэклоге, в процессе, на рассмотрении и закрыты.

Мое приложение scrumban позволяет команде добавлять новые задачи в проект, редактировать свойства задач (например, описание, срок выполнения, сюжетные точки и т.д.) и удалять задачи. Все данные для этого приложения, включая пользователей, имена проектов и задачи, находятся в собственных таблицах в базе данных SQLite.

Передняя часть приложения scrumban React выполняет HTTP-запросы к серверу через контроллер приложения Sinatras. При первоначальной загрузке страницы фронт-энд делает запрос к серверу для получения JSON-объекта, содержащего все задачи и связанные с ними проект и назначенного пользователя. В процессе разработки я уперся в стену.

Как настроить маршрутизацию контроллера приложения таким образом, чтобы включить данные, связанные с сущностями, из нескольких таблиц?

Проблема

Мои модели Ruby настроены так, как показано на диаграмме сущности-связи (ERD), приведенной ниже. У нас есть таблица Projects, таблица Users и таблица Tasks (наша таблица «Join»). Каждая задача имеет один связанный проект и одного связанного пользователя, назначенного на задачу. У проекта и пользователя может быть много задач.

Когда пришло время настраивать контроллер приложения («C» в MVC), я хотел вернуть JSON-объект всех задач в базе данных. Я также хотел включить информацию о проекте и пользователе для каждой из этих задач. Я знал, как получить доступ к связанным данным из одной таблицы (показано ниже), но как включить данные из нескольких таблиц?

1 get '/' do
2   task = Task.all
3   task.to_json(
4     include: :project
5   )
6 end
Войти в полноэкранный режим Выйти из полноэкранного режима

Я искал на форумах и читал документацию Sinatra, но так и не смог найти решение. Я уверен, что ответ задокументирован где-то там. Но мне с трудом удалось его найти.

Решение

Однажды я решил, что разгадаю эту загадку раз и навсегда. Я отказался встраивать обходные пути в приложение React на стороне клиента (например, многократные запросы на выборку, фильтрация массивов для поиска совпадающих внешних и локальных ключей и т.д.).

Я бросил на решение проблемы все, что у меня было. Я попробовал несколько операторов include:. Я пробовал поместить связанные таблицы в объект, как это include: {:project, :user}.

Наконец, я попробовал массив. Это сработало! Поместив [:project, :user] после оператора include:, мы включаем связанные данные из нескольких таблиц!

1 get '/' do
2   task = Task.all
3   task.to_json(
4     include: [:project, :user]
5   )
6 end
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь мы получим связанный проект и назначенного пользователя для каждой задачи! Сейчас это кажется таким простым, но я действительно был в растерянности.

Надеюсь, этот пост поможет кому-нибудь еще. Если это так, дайте мне знать в комментариях!

Фото Joshua Fuller on Unsplash

Оцените статью
devanswers.ru
Добавить комментарий