has_many:通过似乎错了

时间:2014-01-25 23:55:26

标签: ruby-on-rails activerecord ruby-on-rails-4 rails-activerecord

“项目”has_many“ProjectAdmins”和许多“ProjectCollaborators”。

我已将其设置为has_many through关系:

  1. 项目 - 名称:字符串
  2. 用户 - 电子邮件:字符串
  3. ProjectAdmins - 项目:引用,用户:引用
  4. ProjectCollaborators - 项目:引用,用户:引用
  5. 我的模特中的关系是否正确?列出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
    

2 个答案:

答案 0 :(得分:0)

这取决于您希望如何使用关联。

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

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

答案 1 :(得分:0)

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

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

有几种选择。

  1. 更简单的解决方案是仅使用一个ProjectUser模型,该模型具有role:string(或:references +单独的Role模型,如果您' d喜欢保持标准化)字段到您的用户模型。添加一些便捷方法,例如#admin?#collaborator?。而且你已经准备好了。

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

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