0

我在包裝這個問題上遇到了一些麻煩。我的目標是創建這樣一個關係:多對多用戶和公司與多個用戶「組」的關聯

  • 公司可以有很多用戶(團隊成員/僱員)
  • 用戶可以有很多公司
  • 公司的一部分可以有不同的組用戶(即僱員,業主,顧問和執行
  • 用戶可以是許多組的一部分(即, 用戶A可以是員工公司1顧問公司2

基本上,我想說明一個公司的資料,並顯示他們的所有員工,業主的能力,顧問和高管。同樣,我也試圖通過他們是否是員工,所有者,顧問或執行者來搜索用戶。另外,用戶可能與許多不同的公司和許多不同的組相關聯。

我的方法/相信現在的問題是沿具有這些各種各樣的Rails的關係線的東西:

  • 公司 has_many_belongs_to_many 用戶
  • 用戶 has_many_belongs_to_many 公司
  • 公司 has_one EmployeeTeam,通過:用戶
  • 公司 HAS_ONE OwnerTeam,通過:用戶
  • 公司 HAS_ONE AdvisorTeam,通過:用戶
  • 公司 HAS_ONE ExecutiveTeam,通過:個用戶
  • EmployeeTeam的has_many 用戶
  • OwnerTeam的has_many 用戶
  • AdvisorTeam的has_many 用戶
  • ExecutiveTeam的has_many 用戶

老實說,我不確定我是否過於複雜化,如果這是一個有效的方法,或者即使這種方式有效。我對Rails相當陌生,並且非常感謝任何指導/最佳實踐。謝謝!

+0

用戶可以在同一家公司下屬於兩個不同的組嗎?並且用戶可以在公司但不在組中嗎? –

+0

是和是。用戶可以在同一個公司下屬於兩個不同的組。另外,用戶可以在技術上屬於公司而不是團體。 –

+0

並且在不同的公司中是相同的組類型?還是每家公司都有自己的團體類型? –

回答

0
  • 公司has_and_belongs_to_many用戶
  • 用戶has_and_belongs_to_many公司
  • 用戶has_and_belongs_to_many組
  • 集團belongs_to的公司
  • 集團has_and_belongs_to_many用戶
  • EmployeeTeam是集團
  • OwnerTeam的一個子類的子類集團
  • AdvisorTeam是集團的一個子類
  • ExecutiveTeam是集團的一個子類
  • 公司HAS_ONE EmployeeTeam
  • 公司HAS_ONE OwnerTeam
  • 公司HAS_ONE AdvisorTeam
  • 公司HAS_ONE ExecutiveTeam
  • 公司HAS_MANY通過EmployeeTeam員工,類用戶
  • 公司has_many業主通過OwnerTeam,類用戶
  • 家公司的has_many顧問通過AdvisorTeam,類用戶
  • 公司的has_many高管通過ExecutiveTeam,類用戶

這會給你的公司的功能:

company.users #all users 
company.employees #all users with the group employee team 
company.owners #all users with the group owner team 
company.advisors #all users with the group advisor team 
company.executives #all users with the group executive team 

您將需要有創建公司創建他的團體

您將需要驗證用戶未關聯與其公司沒有關聯的組。

它也可以讓你編寫組作爲一個整體的代碼,具體代碼爲每個組類型

這也只會有5個數據庫表

  • 公司
  • users
  • companies_users
  • groups_users
+0

謝謝!快速的問題 - 當你說子類會和使用ActiveRecord的單表繼承一樣嗎? –

+0

是的,我認爲不同的團隊沒有獨特的數據結構,但會有獨特的功能。單表繼承將適用於T. –

0

在經典的數據設計方法中,我會考慮在用戶和公司的交接表中引用組信息。看看

http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association

在2.6章,你看到「assemblies_parts」作爲結表經典多到很多個路口的模式。你可以添加第三個關係。所以,你會得到一個「users_companies_groups」聯結表。在那裏你可以自由分配三個域之間的關係。

限制可能會出現問題:您不希望用戶在同一個公司處於兩個不同的組中。這可以通過例如僅將「user_id」和「company_id」作爲主鍵來解決。由此,用戶被限制在每個公司只有一次。

[編輯:更正最後聲明的限制]

+0

這也是一個很好的解決方案。你能否闡述一下你將如何向'用戶'提出一個'公司'和所希望的'組'的請求。 –

+0

您可以簡單地選擇結點表格。上一次我做軌道是一年前,所以我不想給你錯誤的語法,但它基本上是一個選擇從句「where公司id =想要的c-id和group_id =想要的g-id」。 –

+0

這種方法僅僅是指出它存在一個小缺陷:它基本上說每個團隊都可以存在於任何公司(這就是你要求的)。如果某些公司中只有不同的組可用,則可以在rails中檢查有效性,或者使用帶有兩個聯結表的更復雜的db模型來檢查它的有效性。後者是「更乾淨」(因爲數據庫檢查數據完整性),但具有更高的性能影響(更多表格表示獲取數據時更多連接)。 –