2017-10-12 109 views
0

我有一個用戶模型和一個任務模型。所有用戶都是相同的,每個用戶都可以創建一個新任務並將該任務分配給另一個用戶。在任務模型中,我有一個assigned_by列和一個assigned_to列,這樣任何人都可以創建一個新任務並將其分配給任何其他人。後來我希望每個用戶都能查看分配給他們的所有任務以及他們分配給其他人的所有任務。要做到這一點,我想建立一個關聯。做這樣的事情可以嗎?Rails一個模型兩個協會

class Task < ApplicationRecord 
    belongs_to :user, :foreign_key => 'assigned_by' 
    belongs_to :user, :foreign_key => 'assigned_to' 
end 

我在同一模型中有兩個外鍵。然後在用戶模式中,我有:

class User < ApplicationRecord 
    has_many :tasks 
end 

這是做這種事情的正確方法嗎?

+0

可以嗎?不,第二個'belongs_to:user,:foreign_key =>'assigned_to''會覆蓋前面的關係。 – max

回答

1

您建議的方法將不起作用,因爲您無法定義2個同名的方法(在這種情況下,這兩個方法都將被稱爲user)。

更好的方法是通過它實際調用關係。 例如

class Task < ApplicationRecord 
    belongs_to :assigned_by, class_name: 'User' 
    belongs_to :assigned_to, class_name: 'User' 
end 

您可能還需要在數據庫assigned_by_idassigned_to_id

添加foreign_key選項或撥打外鍵此外,您將需要更改User模型tasks方法是不明確的。

class User < ApplicationRecord 
    has_many :tasks_delegated, foreign_key: 'assigned_by_id', class_name: 'Task' 
    has_many :tasks_assigned, foreign_key: 'assigned_to_id', class_name: 'Task' 
end 
1

試圖這樣做到防止覆蓋

class User < ApplicationRecord 
    has_many :owned_tasks, class_name: "Task", foreign_key: "owner_id" 
    has_many :assigned_tasks, class_name: "Task", foreign_key: "assignee_id" 
end 

class Task < ApplicationRecord 
    belongs_to :owner, class_name: "User", foreign_key: "owner_id" 
    belongs_to :assignee, class_name: "User", foreign_key: "assignee_id" 
end 
2

你可能想要的是設置三個表:

class User < ApplicationRecord 
    has_many :assignments, foreign_key: 'assignee_id' 
    has_many :assignments_as_assigner, foreign_key: 'assignee_id' 
    has_many :tasks, through: :assignments 
    has_many :assigned_tasks, through: :assignments_as_assigner 
    has_many :created_tasks, class_name: 'Task' 
          foreign_key: 'creator' 
end 

class Task < ApplicationRecord 
    belongs_to :creator, class_name: 'User' 
    has_many :assignments 
end 

class Assignment < ApplicationRecord 
    belongs_to :assignee, class_name: 'User' 
    belongs_to :assigner, class_name: 'User' 
    belongs_to :task 
end 

這將創建,這樣一個任務可以被分配給多個用戶的一對多關聯。

模型中的每個關聯都必須有唯一的名稱 - 否則您將覆蓋以前的關聯。