У меня есть проект, который использует Ruby on Rails 5.2 API. В настоящее время у меня есть таблица «многие ко многим», которая дважды ссылается на pages
.
Таблица иерархии страниц
id | parent_page_id | page_id |
1 | 1 | NULL |
2 | 1 | 2 |
3 | 1 | 3 |
4 | 4 | NULL |
Страница таблицы
id | app_id | title
1 | 1 | first page
2 | 1 | second page
3 | 1 | third page
4 | 2 | another page
Таблица приложений
id | title |
1 | first app |
2 | second app |
Таблица ролей приложений
id | user_id | app_id | role |
1 | 1 | 1 | Owner |
1 | 2 | 2 | Owner |
Я пытаюсь расширить его, чтобы вы могли просматривать только на основе доступа к таблице app_role
. Мой маршрут для страниц /api/v1/pages
. Однако таблица pages
не имеет доступа к приложению. Я бы использовал current_user
для получения информации о пользователе, но у меня нет никаких средств для доступа к страницам.
Мой подход заключался в том, чтобы в итоге сделать /api/v1/products/:id/pages_hierarchy
(поверхностное вложение), но я хочу иметь возможность создавать / редактировать и удалять страницы. В итоге я применил метод nested_attributes
.
Pages_Hierarchy
class PageHierarchy < ApplicationRecord
has_paper_trail
belongs_to :app
belongs_to :parent_page, class_name: "Page", foreign_key: :parent_page_id, dependent: :destroy
belongs_to :child_page, class_name: "Page", foreign_key: :page_id, optional: true
accepts_nested_attributes_for :parent_page, allow_destroy: true
accepts_nested_attributes_for :child_page, allow_destroy: true
Есть ли лучшее решение для этого? Это работает, но я чувствую, что это невероятно хакерский подход. Я стараюсь держать его как RESTFul, насколько я могу, и стараюсь избегать мелкого вложения.
Для контекста я использую Pundit
в качестве доступа к своей роли. Таким образом, я могу получить current_user
, но у меня нет возможности получить роль приложения, основанную на маршруте /api/v1/pages
, но у меня есть /api/v1/products/:id/pages/
.