A small gotcha when changing indexes in a migration. To change an index one has to first remove it and then add it again. Removing an index is the tricky part. The documentation states: remove_index(table_name, index_name): Removes the index specified by index_name.
This is not strictly true as it turns out. The docs should probably say: remove_index(table_name, column_name)
The crux is that one cannot use this syntax to remove a named index. Rails assumes the index is named something like "tablename_columnname_index" or something similar.
To remove a named index one has to use the block syntax afaik:
change_table :tablename do |t| t.remove_index :name => :indexname t.index ["columnname"], :name => "indexname", :unique => true end