我有一个现有的导轨桌子,名为
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 中,如何更新现有表中的现有列以使其成为引用另一个表的外键?
如果其他人也遇到同样的问题,我使用的解决方案是使用 SQL 在 Workbench 中进行更改,而不是通过 Rails 迁移:
NULL
并确保引用属性主键和属性外键的数据类型相同 (BIGINT)alter table users add constraint gender_forkey foreign key (gender) references genderoptions (id)
rake db:schema:dump