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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails复杂模型关联,用户和团队之间的共享文档相关的知识,希望对你有一定的参考价值。

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

  • 我有一个用户和一个文档模型
  • 用户可以创建文档。他现在是文档管理员。
    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
答案

我建议以与现有模型类似的方式介绍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。

另一答案

由于您已经具有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

以上是关于Rails复杂模型关联,用户和团队之间的共享文档的主要内容,如果未能解决你的问题,请参考以下文章

复杂的 Rails 模型/关联

Rails:在模型之间共享枚举声明值

如何在Rails 5中删除模型时删除模型的所有关联

Rails Active Record连接查询与排序和限制

将用户与 Rails 中的嵌套模型相关联

Rails - 如何让两个用户 ID 与模型相关联