2017-10-12 74 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 

这将创建,这样一个任务可以被分配给多个用户的一对多关联。

模型中的每个关联都必须有唯一的名称 - 否则您将覆盖以前的关联。