mysql 更新Rails表中的现有列,使其成为另一个表的外键

ycl3bljg  于 5个月前  发布在  Mysql
关注(0)|答案(1)|浏览(49)

我在rails中有一个名为Users的现有表。它有一个名为gender的列。我有另一个名为GenderOptions的表。我想创建一个迁移,以便Users表中的gender列是引用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中,如何更新现有表中的现有列,使其成为引用另一个表的外键?

ogsagwnx

ogsagwnx1#

如果其他人也有同样的问题,我使用的解决方案是使用SQL而不是通过Rails迁移在Rails中进行更改:
1.确保属性的所有值都设置为NULL,并确保引用属性主键和属性外键的数据类型相同(BIGINT)
1.运行alter table users add constraint gender_forkey foreign key (gender) references genderoptions (id)
1.在Rails项目的命令行中运行rake db:schema:dump

相关问题