Я бы порекомендовал представить модели 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
модель.