2014-04-03 31 views
0

我是Ruby on Rails的新手,不知道這是一個好的設置,還是有更好的配置。Ruby on Rails ActiveRecord任務屬於公司&has_many用戶

背景: 該系統將用於分配任務給用戶,跟蹤轉讓人,並允許多人分配任務。

創建公司模型,用戶模型,任務模型和user_tasks模型。
公司類
的has_many:用戶
的has_many:任務

用戶類別
belongs_to的:公司
的has_many:user_tasks
的has_many:任務,通過:user_tasks

任務類
belongs_to:公司
has_many:user_tasks
的has_many:用戶,通過:user_tasks

UserTasks類
belongs_to的:用戶
belongs_to的:任務
*跟蹤與布爾

回答

1

我認爲這是完美的。與has_and_belongs_to_many關聯相比,您可以通過ActiveRecord查詢界面(UserTask.where()UserTask.find_by(user_id: 1)等)訪問聯接模型(UserTasks您的情況),因此擁有has_many (model1), through: (model2)關聯有一大優勢。直接查詢連接表有時可以縮短查詢時間。如果您使用has_and_belongs_to_many關聯,您將擁有一個數據庫表,您無法直接在Rails中訪問,而無需使用SQL。

+0

嘿拉烏爾,當你說「你有數據庫表,你不能通過SQL訪問Rails」,你是什麼意思/你能舉一個例子嗎?這些用於在現有數據庫上構建Rails應用程序的情況嗎? –

+0

嗨Daryll,我的意思是,用'has_and_belongs_to_many'關係,你顯然可以從'Task'表中查詢'User'表,例如使用'User.tasks',但要訪問你需要的連接表像這樣運行一個SQL查詢:'User.find_by_sql(「SELECT * FROM users INNER JOIN user_tasks ON users.id = user_tasks.user_id」)''。關於現有的數據庫,我認爲只要連接表存在,並且Rails和SQL中的連接模型的名稱匹配,就應該可以在現有數據庫之上放置'has_many:.. through:..'關聯向上。 –

0

轉讓你可能不需要UserTasks類,如果它僅僅是一個habtm桌子。所以只需爲該表創建一個遷移,但不要添加該模型。然後在User,做到has_and_belongs_to_many :tasksTaskhas_and_belongs_to_many :users

,我看到的是,公司成立了兩個任務和用戶其他的事情。你可能有業務規則,爲什麼這必須是,但如果沒有,你可能只能說Company -> has_many :tasks, through: :users

+1

你有一點,但如果他們需要特定的「UserTask」上的新列,該怎麼辦?例如,我可以分配給一個任務兩次,一個作爲程序員,另一個作爲設計師。所以我在UserTask列上需要一些「JobDescription」列,我需要兩行UserTask表來表示我是一個任務的程序員,另一個表示我是一個任務的設計師。 –

+0

Daryll正確。如果它只是一個habtm表,那麼這個類不是必需的,但是如果存儲其他數據,那麼中間類將需要在那裏。 –

+0

嗨布蘭登 - 我與使用HABTM唯一的問題是,我需要跟蹤誰最初分配給其他人的任務。此外,我同意Daryll,我可能需要更新UserTask表以包含其他條件。我將company_id存儲在事件中,我們需要從關係表中刪除(激發)user_id ...我們仍然希望任務存在,從而允許我們重新分配給其他用戶。 – Puches

0

我贊成:has_many, :through超過has_many_and_belongs_to_many或HABTM。例如,我可以分配給一個任務兩次,一個作爲程序員,另一個作爲設計師。所以我在UserTask列上需要一些「JobDescription」列,我需要兩行UserTask表來表示我是一個任務的程序員,另一個表示我是一個任務的設計師。

儘管HABTM較短,但您希望編寫易於更改的軟件,您可能會在將來更改軟件,例如在同一任務中執行兩個子任務的情況下。請記住,數據庫中的一行是一段數據,或者「一件事」,如果這樣做有道理的話。至少,你會得到時間戳。