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 关系,因为你限制每个用户只能有一个任务
我是 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 关系,因为你限制每个用户只能有一个任务