我在尝试回滚我的一次迁移时遇到了问题。看起来好像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
我已经更改了列名,但示例仍然存在。我可以在第二次迁移中进行更改,但这仍然意味着我无法在此表上回滚迁移。我可以在新的迁移中重命名索引,但这仍然会阻止我进行单次迁移。
有没有人有关于如何解决这个问题的想法?
答案 0 :(得分:7)
您的数据库架构看起来实际上具有名为prices_on_column_and_other_column_and_third_column
的索引。您可能已经在之前的游戏中使用迁移定义了索引。但不仅仅是从迁移中删除索引定义。
如果确实如此,您有两个选择:
: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