所以我正在与一位同事一起工作,他添加了一些额外的迁移文件,按照正常程序,一旦我提取了他们的版本,我就运行了rails db:migrate。我最终得到以下错误:
Index name 'index_authorizations_on_user_id' on table 'authorizations' already exists
ArgumentError: Index name 'index_authorizations_on_user_id' on table 'authorizations' already exists
所以我去检查架构并且表已经存在。那为什么失败了呢?通常在过去它只会在进行迁移时生成新的表条目/更新,那么为什么不忽略它呢?
我尝试过回滚并获取: 此迁移使用remove_columns,它不可自动反转。
我已经尝试过bin / rails db:migrate RAILS_ENV = development我遇到了同样的错误。
我已经完成了db:reset,db:drop,这一切都回到了我无法运行的挂起迁移问题。我做错了什么?
他们添加了以下迁移:20171024074328_create_authorizations.rb
class CreateAuthorizations < ActiveRecord::Migration[5.1]
def change
create_table :authorizations do |t|
t.string :provider
t.string :uid
t.references :user, foreign_key: true
t.timestamps
add_index :authorizations, :user_id
add_index :authorizations, [:provider, :uid], unique: true
end
end
端
答案 0 :(得分:3)
此:
t.references :user, foreign_key: true
为您添加authorizations.user_id
的索引。如果您选中references
documentation,它会指向add_reference
,并说明:
:index
添加适当的索引。默认为true。 [...]
因此,当您致电index: true
并创建t.references :user
创建的相同索引时,add_index :authorizations, :user_id
是默认设置。
答案 1 :(得分:0)
所以我发现“工作”的唯一一件事就是实际删除迁移文件然后运行rails db:migrate。没有抓到任何东西,没有错误。
不喜欢这个有用的事实。
答案 2 :(得分:0)
检查它是表还是已更改的表,大多数情况下,您需要删除表或删除列,然后再次运行迁移,这样做会很好