Я ищу способ объединить четыре таблицы вместе с таблицей объединения в Rails 5.2, но пока нашел только способ объединения двух таблиц.
Мои таблицы:
Users
Groups
Events
Roles
Они все многие: многие. Таблица Роли содержит все возможные роли, которые существуют в системе.
В качестве примера использования предположим, что роль с идентификатором 16 - это «can_delete_event» со значением true , тогда как идентификатор роли 17 имеет то же правило со значением false .
Роли:
ID | Title | Value
--------------------------------
16 | can_delete_event | true
17 | can_delete_event | false
В этом случае пользователь в любой группе, имеющей роль 16, может удалить любое событие, которому он назначен, но если он также находится в группе с ролью 17 эта специфицирующая способность c удалена, а все остальные правила этой группы остаются. Такое поведение переопределения также применимо, если на пользователя ссылается непосредственно его идентификатор пользователя в таблице ролей.
Таким образом, если пользователь № 12 находится в группе № 2 и хочет удалить событие № 25, он должен быть хотя бы одной из этих записей в таблице соединений:
Event | User | Group | Role
---------------------------
25 | 12 | | 16
25 | | 2 | 16
Теперь вопрос How on earth can I link all these tables together in Rails?
. Я портирую веб-сайт PHP на Rails, и в версии PHP все работает нормально с той же структурой базы данных. Я знаю, что могу построить это как обычную таблицу и использовать ее таким образом, но я хочу сделать все правильно, поэтому я создаю хорошую практику для будущих (более важных) проектов.
Скорость не беспокойство, так как только небольшая база сотрудников будет обновлять детали событий, и только несколько раз в месяц.
Я пробовал это:
class CreateEventGroupRoleUsers < ActiveRecord::Migration[5.2]
def change
create_join_table :events, :groups, :roles, :users do |t|
t.index :event_id
t.index :group_id
t.index :role_id
t.index :user_id
end
end
end
Но я получил эту ошибку во время миграции:
ArgumentError: wrong number of arguments (given 4, expected 2)