Слишком длинное имя временного индекса в миграции Rails - PullRequest
3 голосов
/ 13 декабря 2011

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

7 голосов
/ 13 декабря 2011

Похоже, что ваша схема базы данных имеет индекс с именем 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, чтобы rails генерировал более короткое имя для индекса.
  • Если вы столкнулись с этой проблемой в производственной базе данных, это немного сложнее.Возможно, вам придется вручную удалить индекс из консоли базы данных.
3 голосов
/ 02 августа 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...