Ruby on rails rails db:migrate在创建索引时失败
我正在接管一个已有几年历史的Rails应用程序的维护工作。无法使当前版本()正常工作,在与当前的维护人员交谈后,我开始将ruby版本从2.3升级到2.5.5,将rails从3.2.22升级到5.2.3。 不幸的是,这是一个很大的工作,我已经改变了大量的代码 我终于有了一个工作系统,我认为我的单元测试也很好,但是当我想要设置测试环境时,我在运行“rails db:migrate”时遇到了一个错误。 我搜索了很多地方,发现了类似的问题,但它们似乎都有不同的原因。我目前唯一的线索是,我正在Windows上开发,在某个地方(不幸失去了位置),有人建议这可能是Windows唯一的问题 我不是一个非常有经验的Ruby开发人员(我从小编程Cobol和汇编,现在已经开始从事非编程工作;编程是我的爱好之一),我一直在努力找出迁移不起作用的原因 我不知道这个最小的、可复制的例子会是什么样子。我想这将涉及到所有(生成的)迁移脚本,包括失败的脚本。下面是失败的脚本:Ruby on rails rails db:migrate在创建索引时失败,ruby-on-rails,Ruby On Rails,我正在接管一个已有几年历史的Rails应用程序的维护工作。无法使当前版本()正常工作,在与当前的维护人员交谈后,我开始将ruby版本从2.3升级到2.5.5,将rails从3.2.22升级到5.2.3。 不幸的是,这是一个很大的工作,我已经改变了大量的代码 我终于有了一个工作系统,我认为我的单元测试也很好,但是当我想要设置测试环境时,我在运行“rails db:migrate”时遇到了一个错误。 我搜索了很多地方,发现了类似的问题,但它们似乎都有不同的原因。我目前唯一的线索是,我正在Window
class CreateReviews < ActiveRecord::Migration[5.2]
def change
create_table :reviews do |t|
t.text :body
t.integer :score
t.references :session
t.references :presenter
t.timestamps
end
add_index :reviews, :session_id
add_index :reviews, :presenter_id
end
end
class CreateReviews
注意:我必须修改所有迁移脚本以添加[5.2]
这是我得到的输出:
D:\dev\propile>rails db:migrate
== 20120520144512 CreateReviews: migrating ====================================
-- create_table(:reviews)
-> 0.0044s
-- add_index(:reviews, :session_id)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
Index name 'index_reviews_on_session_id' on table 'reviews' already existsD:/dev/propile/db/migrate/20120520144512_create_reviews.rb:11:in `change'
script/rails:6:in `require'
script/rails:6:in `<main>'
ArgumentError: Index name 'index_reviews_on_session_id' on table 'reviews' already exists
D:/dev/propile/db/migrate/20120520144512_create_reviews.rb:11:in `change'
script/rails:6:in `require'
script/rails:6:in `<main>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
D:\dev\propile>rails数据库:迁移
==20120520144512 CreateReviews:正在迁移====================================
--创建表格(:评论)
->0.0044s
--添加索引(:评论,:会话\u id)
rails中止了!
StandardError:发生错误,此迁移和所有后续迁移已取消:
表“reviews”上的索引名“Index\u reviews\u on\u session\u id”已存在:/dev/propile/db/migrate/201205201144512\u create\u reviews.rb:11:在“change”中
脚本/rails:6:in'require'
脚本/rails:6:in`'
ArgumentError:表“reviews”上的索引名称“Index\u reviews\u on\u session\u id”已存在
D:/dev/propile/db/migrate/20120520144512\u创建\u评论。rb:11:in'change'
脚本/rails:6:in'require'
脚本/rails:6:in`'
任务:TOP=>db:migrate
(通过使用--trace运行任务查看完整跟踪)
您可以尝试注释掉在会话id上添加索引的行。。。它告诉您索引已经存在。我怀疑旧的rails版本在您使用t.references添加外键时没有自动添加索引,但是更新的版本确实很好奇,如果这个问题仍然发生在RAILS\u ENV=test rake db:drop db:create db:migrate
@maxpleaner中,我想这确实发生了,从RAILS 4开始,但是不要引用我的话,谢谢@maxpleaner,如果我注释掉添加它移动的索引的那一行的话。然后在下一个索引上失败,但我可以修复:)您可以尝试注释掉在会话id上添加索引的行。。。它告诉您索引已经存在。我怀疑旧的rails版本在您使用t.references添加外键时没有自动添加索引,但是更新的版本确实很好奇,如果这个问题仍然发生在RAILS\u ENV=test rake db:drop db:create db:migrate
@maxpleaner中,我想这确实发生了,从RAILS 4开始,但是不要引用我的话,谢谢@maxpleaner,如果我注释掉添加它移动的索引的那一行的话。然后在下一个索引上失败,但我可以修复它:)