Разрешения роли с таблицами "многие ко многим" - PullRequest
0 голосов
/ 12 марта 2019

У меня есть проект, который использует 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/.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...