Ruby on rails rails db:migrate在创建索引时失败

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

我正在接管一个已有几年历史的Rails应用程序的维护工作。无法使当前版本()正常工作,在与当前的维护人员交谈后,我开始将ruby版本从2.3升级到2.5.5,将rails从3.2.22升级到5.2.3。 不幸的是,这是一个很大的工作,我已经改变了大量的代码

我终于有了一个工作系统,我认为我的单元测试也很好,但是当我想要设置测试环境时,我在运行“rails db:migrate”时遇到了一个错误。 我搜索了很多地方,发现了类似的问题,但它们似乎都有不同的原因。我目前唯一的线索是,我正在Windows上开发,在某个地方(不幸失去了位置),有人建议这可能是Windows唯一的问题

我不是一个非常有经验的Ruby开发人员(我从小编程Cobol和汇编,现在已经开始从事非编程工作;编程是我的爱好之一),我一直在努力找出迁移不起作用的原因

我不知道这个最小的、可复制的例子会是什么样子。我想这将涉及到所有(生成的)迁移脚本,包括失败的脚本。下面是失败的脚本:

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,如果我注释掉添加它移动的索引的那一行的话。然后在下一个索引上失败,但我可以修复它:)