Ассоциация моделей Rails Complex, общий документ между пользователями и командами - PullRequest
1 голос
/ 30 апреля 2020

Я имею в виду сложную ассоциацию моделей, и мне было интересно, как я могу это сделать. Это то, чего я хочу достичь sh.

  • У меня есть пользователь и модель документа
  • Пользователь может создавать документы. Теперь он администратор документа.
    1. Он может добавлять других пользователей в свой документ и давать им разрешения, такие как «Редактор», «Просмотр», «Администратор»
    2. Он также может создавать команду, группу пользователей и добавлять несколько команд к своему документ. Каждый пользователь в команде, который Пользователь добавил в свой документ, также будет иметь разрешения. Пользователь может принадлежать ко многим командам.

Я немного озадачен ассоциациями, которые мне придется настроить. Это код, который я имею до сих пор, который не включал аспект команды:

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

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

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

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Поскольку у вас уже есть модель participation, вы можете использовать ее в качестве модели соединения между пользователями и командами. Поскольку user может принадлежать нескольким группам, а документ может иметь несколько групп, вы можете использовать has_many через отношения между командами и документами. Мы назовем это DocumentTeam модель.

class User < ApplicationRecord
  has_many :participations
  has_many :documents, through: :participations
  has_many :teams, through: :participations
end

class Participation < ApplicationRecord
  belongs_to :document
  belongs_to :user
  belongs_to :team, optional: true
  enum role: [ :admin, :editor, :viewer ]
end

class Team < ApplicationRecord
  has_many :participations
  has_many :users, through: :participations
  has_many :document_teams
  has_many :document, through: :document_teams
end

class Document < ApplicationRecord
  has_many :participations
  has_many :users, through: :participations
  has_many :document_teams
  has_many :teams, through: :document_teams
end

class DocumentTeam < ApplicationRecord
  belongs_to :document
  belongs_to :team
end
0 голосов
/ 30 апреля 2020

Я бы порекомендовал представить модели Team и TeamMembership аналогично существующим моделям. Также измените ассоциацию own_to на Участие с user на polymorphi c participant.

class Team < ApplicationRecord
  has_many :team_memberships
  has_many :users, through: :team_memberships
  has_many :participations, as: :participant
end

class TeamMembership < ApplicationRecord
  belongs_to :team
  belongs_to :user
end

class User < ApplicationRecord
  has_many :team_memberships
  has_many :teams, through: :team_memberships
  has_many :participations, as: :participant
end

class Participation < ApplicationRecord
  belongs_to :participant, polymorphic: true
  belongs_to :document
  enum role: [ :admin, :editor, :viewer ]
end

class Document < ApplicationRecord
  has_many :participations

  # if desired create a users method to conveniently get a list of users with access to the document
  def users
    @users ||= participations.flat_map do |participation|
      case participation.partipant
      when User
        [participation.participant]
      when Team
        participation.participant.users
      end
    end
  end
end

Я добавил бы только has_many: через ассоциации, когда вы обнаруживаете преимущества / необходимость их наличия. Это уменьшит сложность их обслуживания, если вы не укажете для них c вариант использования. В случае, когда у пользователя есть ассоциация команд, вполне очевидно, что вы, вероятно, захотите получить команды, в состав которых входит пользователь, и поскольку в объекте TeamMembership нет конкретной c информации, которую вы, вероятно, захотите нужно в этом определении, это хороший has_many: через чтобы иметь.

РЕДАКТИРОВАТЬ: Добавлено Document модель.

...