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

时间:2011-12-12 20:22:09

标签: ruby-on-rails ruby-on-rails-3 rails-migrations

我在尝试回滚我的一次迁移时遇到了问题。看起来好像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

这是我得到的错误:

==  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

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

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

2 个答案:

答案 0 :(得分:7)

您的数据库架构看起来实际上具有名为prices_on_column_and_other_column_and_third_column的索引。您可能已经在之前的游戏中使用迁移定义了索引。但不仅仅是从迁移中删除索引定义。

如果确实如此,您有两个选择:

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

答案 1 :(得分:3)

今天遇到这个问题并通过更改迁移来修复它,包括删除和添加导致长名称问题的索引。这样,当我改变列类型(即真正长名称的位置)时,不会跟踪更改。

我添加了以下内容:

class FixBadColumnTypeInNotifications < ActiveRecord::Migration
  def change
    # replace string ID with integer so it is Postgres friendly
    remove_index :notifications, ["notifiable_id","notifiable_type"]
    change_column :notifications, :notifiable_id, :integer
    # shortened index name
    add_index "notifications", ["notifiable_id","notifiable_type"], :name => "notifs_on_poly_id_and_type"
  end
 end