Rails一个模型两个协会

Rails one model two associations

我有一个用户模型和一个任务模型。所有用户都是相同的,每个用户都可以创建一个新任务并将该任务分配给另一个用户。在任务模型中,我有一个 assigned_by 列和一个 assigned_to 列,这样任何人都可以创建新任务并将其分配给其他人。稍后我希望每个用户都能查看分配给他们的所有任务以及他们分配给其他人的所有任务。为此,我想建立一个协会。这样做可以吗?

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

这是执行此类操作的正确方法吗?

尝试这样做以防止覆盖

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

您可能想要设置三个表:

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

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

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

您建议的方法将不起作用,因为您不能定义 2 个具有相同名称的方法(在这种情况下,两者都将被称为 user)。

更好的方法是按实际情况调用关系。 例如

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

您可能还需要添加一个foreign_key选项或调用数据库中的外键assigned_by_idassigned_to_id

此外,您需要更改 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