Rails复杂模型关联,用户和团队之间的共享文档
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails复杂模型关联,用户和团队之间的共享文档相关的知识,希望对你有一定的参考价值。
我想到的是一个复杂的模型关联,并且想知道如何实现它。这就是我要完成的。
- 我有一个用户和一个文档模型
- 用户可以创建文档。他现在是文档管理员。
- 他可以将其他用户添加到他的文档中,并向他们授予诸如编辑器,查看器,管理员的权限
- 他还可以组成一个团队,一组用户,并将多个团队添加到他的文档中。用户已添加到其文档的团队中的每个用户也将具有权限。一个用户可以属于多个团队。
我对必须设置的关联有些困惑。这是我到目前为止的代码,尚未包含团队方面的内容:
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复杂模型关联,用户和团队之间的共享文档的主要内容,如果未能解决你的问题,请参考以下文章