Rails Complex Active Record Relationship - PullRequest
       65

Rails Complex Active Record Relationship

1 голос
/ 05 апреля 2020

Я имею в виду сложные отношения активной записи, и мне было интересно, как именно я это сделаю sh. По сути:

A Пользователь может создать Board . Затем пользователь может добавить других пользователей на эту доску для совместного редактирования. Добавлены пользователи из Team . Каждый добавленный пользователь имеет Роль на каждой доске (Admin, Editor, Viewer).

Я думал о том, чтобы настроить его следующим образом:

  • A Пользователь имеет много Советов

  • A Доска имеет много пользователей через Команды

  • A Команда имеет много пользователей ?

Ролевая часть сбила меня с толку. Нужно ли устанавливать TeamUser модель, которая имеет много ролей , или у каждого пользователя есть много ролей , которые принадлежат Совет ? Роль вообще должна быть ее собственной моделью?

Какой самый эффективный способ достижения sh моей цели?

1 Ответ

1 голос
/ 05 апреля 2020

Если пользователь может принадлежать ко многим командам и может иметь много ролей, logi c может выглядеть примерно так:

Вам нужна таблица соединений, чтобы обеспечить отношение N-to-N между пользователем и доской модель. Но дело в том, что когда вы добавляете пользователя на доску, вы даете ему роль в этом участии. Это хорошее место для хранения информации о роли в этом участии. Таким образом, наша объединенная таблица UsersBoards превращается в модель участия (или как вы хотите ее называть). Наша модель участия теперь содержит информацию о пользователе, плате и роли (все они имеют внешний ключ).

Я не совсем понял назначение модели Team, но я думаю, что добавить пользователя в него легко команда, когда это необходимо. Это не повредит нашей логике c.

Кроме того, если вы не планируете добавлять дополнительные функции в будущем, роль также может быть перечислением.

class User < ApplicationRecord
  has_many :participations
  has_many :boards, through: :participations
end

class Board < ApplicationRecord
  has_many :participations
  has_many :users, through: :participations
end

class Participation < ApplicationRecord
  belongs_to :user
  belongs_to :board
  enum role: [ :admin, :editor, :viewer ]
end

user = User.first
user.participations.first.board #Board
user.participations.first.admin? #true
user.boards

И Вы можете добавить вспомогательные методы или делегировать в модели для сокращения запроса.

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