我想到的是一个复杂的模型关联,并且想知道如何实现它。这就是我要完成的。
我对必须设置的关联有些困惑。这是我到目前为止的代码,尚未包含团队方面的内容:
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