Rails复杂模型关联,用户和团队之间的共享文档

问题描述 投票:0回答:2

我想到的是一个复杂的模型关联,并且想知道如何实现它。这就是我要完成的。

  • 我有一个用户和一个文档模型
  • 用户可以创建文档。他现在是文档管理员。
    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
ruby-on-rails associations rails-activerecord model-associations ruby-on-rails-6
2个回答
0
投票

我建议以与现有模型类似的方式介绍Team和TeamMembership模型。另外,将参与时从属的关联从user更改为多态participant

class Team < ApplicationRecord
  has_many :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

当您发现关联的好处/需要它们时,我只会添加has_many:through关联。除非您有特定的用例,否则这将降低维护它们的复杂性。在用户具有团队关联的情况下,很明显,您很可能希望获得用户所属的团队,并且由于TeamMembership对象中没有特定的信息,因此您很可能需要确定,这是一个很好的has_many:through to have。


0
投票

由于您已经具有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
© www.soinside.com 2019 - 2024. All rights reserved.