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類型使用不同的方法,第二個更好。