Rails:为新 has_many 关联迁移

Rails: Migration for new has_many association

我是 Ruby 和 Rails 的新手,所以这是某种“告诉我我做错了什么”的问题:

我有一个包含一些现有 ApplicationRecords 的项目。现在我想为其中之一添加一个新的 has_many 关联(称为“任务”)。

has_many :assistants, class_name: "User"

我在这里提供 class 名称,因为已经有另一个现有协会 has_many :users。 (每个任务可以有0-*个助手。)

为此创建 Migration 的正确方法是什么?我创建了以下内容:

class AddAssistantsToTask < ActiveRecord::Migration[6.1]
  def change
    add_reference :tasks, :assistant, null: true, foreign_key: {to_table: :users}, type: :uuid
  end
end

在控制器中,我尝试将用户添加到助手关联中:

if !@task.assistants.includes(@user)
    @task.assistants << @user
end

到目前为止,似乎一切都运行符合预期。当我尝试使用

使用 Rails 控制台查询添加的用户时
Task.find("some id").assistants.count

我收到错误消息,指出 users.task_id 列不存在。

在此先感谢您的帮助。

你的陈述方向错误

你有一个 task has_many assistants,所以 foreign_key 应该在 assistant 模型上,在本例中是 Users

class AddAssistantsToTask < ActiveRecord::Migration[6.1]
  def change
    # Add foreign key assistant_id to users that points to tasks
    add_reference :users, :assistant, type: :uuid, null: true, foreign_key: { to_table: :tasks }
  end
end

现在您可以看到 table Users 上的名称 assistant_id 没有意义,所以我会重命名为 assisted_task 或只是任务

class AddAssistantsToTask < ActiveRecord::Migration[6.1]
  def change
    # Add foreign key assistant_id to users that points to
    add_reference :users, :assisted_task, type: :uuid, null: true, foreign_key: { to_table: :tasks }
  end
end
has_many :assistants, class_name: "User", foreign_key: :assisted_task_id

task

class AddAssistantsToTask < ActiveRecord::Migration[6.1]
  def change
    # Add foreign key assistant_id to users that points to
    add_reference :users, :task, type: :uuid, null: true, foreign_key: true
  end
end
has_many :assistants, class_name: "User"

但我同意@BroiSatse 的观点,这应该是一个 many-to-many 关系,因为你限制每个用户只能有一个任务