Слишком длинное имя временного индекса при миграции Rails

У меня проблема с попыткой откатить одну из моих миграций. Кажется, что 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

Я изменил имена столбцов, но пример остался. Я могу просто внести изменения во вторую миграцию, но это по-прежнему означает, что я не могу откатить миграции для этой таблицы. Я могу переименовать индекс в новой миграции, но это все равно блокирует меня от этой единственной миграции.

У кого-нибудь есть идеи, как обойти эту проблему?


person caitlin    schedule 12.12.2011    source источник
comment
это настоящее имя задействованного индекса?   -  person cristian    schedule 13.12.2011
comment
Нет нет. Просто пытался немного абстрагироваться от реального проекта.   -  person caitlin    schedule 07.04.2012


Ответы (2)


Похоже, что ваша схема базы данных на самом деле имеет индекс с именем prices_on_column_and_other_column_and_third_column. Вероятно, вы определили индекс в предыдущей игре с миграциями. Но чем просто удалено определение индекса из миграций.

Если это правда, у вас есть 2 варианта:

  • Более простой (работает, если ваш код не находится в производстве). Вы можете воссоздать базу данных с нуля, используя миграции (не из db/schema.rb), вызвав rake db:drop db:create db:migrate. Убедитесь, что вы не создаете этот индекс с длинным именем в других файлах миграции. Если вы это сделаете, добавьте параметры :name => 'short_index_name' к вызову add_index, чтобы рельсы генерировали более короткое имя для индекса.
  • Если вы столкнулись с этой проблемой в производственной базе данных, все немного сложнее. Возможно, вам придется вручную удалить индекс из консоли базы данных.
person cryo28    schedule 12.12.2011
comment
rake db:migrate:reset также полезен. - person Paulo Casaretto; 09.01.2013
comment
Полезно, но удалит все записи (по понятным причинам). - person Ted; 06.07.2013

Имел эту проблему сегодня и исправил ее, изменив миграцию, включив в нее удаление и добавление индекса, вызывающего проблему с длинным именем. Таким образом, изменение не отслеживается, пока я изменяю тип столбца (именно здесь возникает действительно длинное имя)

Я добавил следующее:

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
person NikoRoberts    schedule 02.08.2013