Rails迁移中的临时索引名称太长

cai*_*lin 3 ruby-on-rails rails-migrations ruby-on-rails-3

我在尝试回滚我的一个迁移时遇到了问题.看起来好像Rails正在为临时索引生成一个临时表.我在这个表上的实际索引少于64个字符,但每当Rails尝试为它创建一个临时索引时,它将变成一个长度超过64个字符的名称,并抛出一个错误.

这是我的简单迁移:

class AddColumnNameToPrices < ActiveRecord::Migration
  def self.up
     add_column :prices, :column_name, :decimal
  end

  def self.down
    remove_column :prices, :column_name
  end
end
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

==  AddColumnNameToPrices: reverting ============================================
-- remove_column(:prices, :column_name)
rake aborted!
An error has occurred, this and all later migrations canceled:

Index name 'temp_index_altered_prices_on_column_and_other_column_and_third_column' on table     'altered_prices' is too long; the limit is 64 characters
Run Code Online (Sandbox Code Playgroud)

我已经更改了列名,但示例仍然存在.我可以在第二次迁移中进行更改,但这仍然意味着我无法在此表上回滚迁移.我可以在新的迁移中重命名索引,但这仍然使我无法进行单次迁移.

有没有人有关于如何解决这个问题的想法?

cry*_*o28 7

看起来您的数据库模式实际上已经调用了索引prices_on_column_and_other_column_and_third_column.您可能已经在之前的游戏中使用迁移定义了索引.但不仅仅是从迁移中删除了索引定义.

如果是真的,你有两个选择:

  • 更简单的(如果您的代码不在生产中,则有效).您可以通过调用rake db:drop db:create db:migrate,使用迁移(而不是db/schema.rb)从头开始重新创建数据库.确保不在其他迁移文件中使用长名称创建此索引.如果这样做,请添加:name => 'short_index_name'add_index调用选项,以使make rails为索引生成更短的名称.
  • 如果您在生产数据库上遇到此问题,则会更复杂一些.您可能需要从数据库控制台手动删除索引.