0

“项目”has_many“ProjectAdmins”和许多“ProjectCollaborators”。has_many:通过似乎是错误的

我已经设置此为has_many through关系:

  1. 项目 - 名称:字符串
  2. 用户 - 电子邮件:字符串
  3. ProjectAdmins - 项目:引用,用户:引用
  4. ProjectCollaborators - 项目:参考,用户:参考

我的关系在我的模型中是否正确?列出has_many :users两次似乎是错误的。

项目

has_many :project_admins 
has_many :project_collaborators 
has_many :users, through: :project_admins 
has_many :users, through: :project_collaborators 

用户

has_many :project_admins 
has_many :project_collaborators 
has_many :projects, through: project_admins 
has_many :projects, through: project_collaborators 

回答

0

这取决于你想如何使用您的关联。

如果用户不能同时成为同一项目的协作者和管理员,则可以将两个模型合并到一个模型中,并使用user_type类型的属性确定'admin'或'协作者'或具有特定的作用。

在我看来,应该由您的数据驱动的决定。

0

这不会起作用,因为has_many,belongs_to等方法只是将一堆读者和作者添加到您的模型中。当您尝试创建具有相同名称的关联时,这些方法将被覆盖。

我会以不同的方式解决这个问题。

有几种选择。

  1. 一个简单的解决方案是只使用一个ProjectUser模式,将有一个role:string(或:references +独立Role模型,如果你想使事情归一化)领域的用户模型。添加一堆便利方法,如#admin?#collaborator?。而且你们都成了。

  2. 或者你可以去STI(单表继承)。创建基类ProjectUser project:references user:references并从中继承ProjectAdminProjectCollaborator。或者,由于ProjectAdmin可能始终是合作者,因此您可以从ProjectCollaborator继承。

基本上,两种解决方案都会给你相同的结果。但我会说,如果你需要针对不同的ProjectUser类型使用不同的方法,第二个更好。