将 Rails 表中的现有列更新为另一个表的外键

问题描述 投票:0回答:1

我有一个现有的导轨桌子,名为

Users
。它有一个名为
gender
的列。我还有另一张桌子,名为
GenderOptions
。我想创建一个迁移,以便
gender
表中的
Users
列成为引用
GenderOptions
表的外键。

第一次尝试迁移文件如下所示:

class ForeignKey < ActiveRecord::Migration[7.1]
  def change
    add_reference :users, :gender, foreign_key: {to_table: :GenderOptions}
  end
end

但是我收到一条错误消息:

 add_reference(:users, :gender, {:foreign_key=>{:to_table=>:GenderOptions}})
rake aborted!
StandardError: An error has occurred, all later migrations canceled: (StandardError)

Mysql2::Error: Duplicate column name 'gender_id'
...:in `change'

Caused by:
ActiveRecord::StatementInvalid: Mysql2::Error: Duplicate column name 'gender_id' (ActiveRecord::StatementInvalid)
...:in `change'

Caused by:
Mysql2::Error: Duplicate column name 'gender_id' (Mysql2::Error)
...:in `change'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

我也尝试过:

class ForeignKey < ActiveRecord::Migration[7.1]
  def change
    add_foreign_key :users, :GenderOptions, column: :gender_id, primary_key: :id

  end
end

但我遇到了同样的错误。

在 Rails 中,如何更新现有表中的现有列以使其成为引用另一个表的外键?

mysql ruby-on-rails foreign-keys rails-migrations
1个回答
0
投票

如果其他人也遇到同样的问题,我使用的解决方案是使用 SQL 在 Workbench 中进行更改,而不是通过 Rails 迁移:

  1. 确保属性的所有值均设置为
    NULL
    并确保引用属性主键和属性外键的数据类型相同 (BIGINT)
  2. 奔跑
    alter table users add constraint gender_forkey foreign key (gender) references genderoptions (id)
  3. 在 Rails 项目的命令行中运行
    rake db:schema:dump
© www.soinside.com 2019 - 2024. All rights reserved.