2013-03-15 5 views
2

Я нахожусь в ветке git и пытаюсь откинуть две миграции, прежде чем уничтожить ветку. Самый последний перенос добавляет столбец в таблицу, которую я хочу сохранить (и которая является частью мастера, а не ветви, которую нужно удалить), поэтому отбрасывание всей таблицы не является решением (если только я не буду снова воссоздавать его). В любом случае, я, должно быть, сделал что-то не так, потому что когда я попытался удалить столбец apple_id из таблицы оценок, я получил эту ошибку прерывания.Индексное имя слишком длинное для миграции отката

Это миграция, что я пытаюсь откатить

add_column :scores, :apple_id, :integer 

Однако сообщение об ошибке (см ниже), со ссылкой на индексы, которые я создал с первоначальной миграции (часть основной ветви), что создание таблицы

add_index :scores, [:user_id, :created_at, :funded, :started] 

Можете ли вы предложить, что я могу сделать?

== AddAppleidColumnToScores: reverting ======================================= 
-- remove_column("scores", :apple_id) 
rake aborted! 
An error has occurred, this and all later migrations canceled: 

Index name 'temp_index_altered_scores_on_user_id_and_created_at_and_funded_and_started' on table 'altered_scores' is too long; the limit is 64 characters 

Обновление: чтение этого SO вопрос How do I handle too long index names in a Ruby on Rails migration with MySQL?, я получил больше информации об источнике проблемы, но не знаю, как ее решить. Оба SQL и Postgres имеют 64 ограничения на число символов

Index name 'index_studies_on_user_id_and_university_id_and_subject_\ 
      name_id_and_subject_type_id' on table 'studies' is too long; \ 
      the limit is 64 characters 

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

add_index :studies, ["user_id", "university_id", \ 
      "subject_name_id", "subject_type_id"], 
      :unique => true, :name => 'my_index' 

Обновление: в ответ на комментарии, я использую Rails 3.2.12. Это миграция, которая добавляет столбец

class AddAppleidColumnToScores < ActiveRecord::Migration 
    def change 
    add_column :scores, :apple_id, :integer 
    end 
end 

Кроме того, причина, почему я не хочу, чтобы удалить таблицу, что я не был уверен, что проблемы, которые она может вызвать в воссоздании его, так как а) основная часть была созданный мастером ветки, а столбец, добавленный в ветку, и b) Я не знал, что делать с файлом миграции для упавшей таблицы? так как это была четвертая (около 10) таблиц, которые я создал, я не знаю, как ее запустить, и только она снова.

+0

Какую версию Rails вы используете? Я воссоздал проект с нуля с помощью Rails v3.1.0, но откат работает нормально. Я также использую PG v9.0.1. Когда я создаю индекс как 'add_index: score, [: user_id,: created_at,: funded,: started]', имя индекса - 'index_scores_on_user_id_and_created_at_and_funded_and_started'. –

+0

Если вы не хотите сбросить и воссоздать свою базу данных с нуля, я настоятельно рекомендую вам удалить индекс вручную, в консоли db. И можете ли вы вставить здесь полную миграцию «AddAppleIdColumnToScores» и ваш schema.rb перед откатом? –

+0

Вы пытались удалить индекс с помощью чистого SQL? –

ответ

0

Можете скопировать или вставить миграцию?

Вот мой:

class AddAppleIdColumnToScores < ActiveRecord::Migration 

    def self.up 
    add_column :scores, :apple_id, :integer 
    add_index :scores, [:user_id, :created_at, :funded, :started] 
    end 

    def self.down 

    # delete index MySql way 
    # execute "DROP INDEX index_scores_on_user_id_and_created_at_and_funded_and_started ON scores" 

    # delete index Postgresql way 
    # execute "DROP INDEX index_scores_on_user_id_and_created_at_and_funded_and_started" 

    # delete index Rails way/not necessary if you remove the column 
    # remove_index :scores, [:user_id, :created_at, :funded, :started] 

    remove_column :scores, :apple_id 
    end 
end 
+0

Я обновил OP с помощью Rails v (3.2.12) и миграции. Я предполагаю, что я должен просто отказаться от стола. Как мне это сделать, и как лучше всего его воссоздать? Создать новую миграцию или просто перенести миграцию, которая создала эту таблицу? Имеет ли значение, что миграция не самая последняя? (т. е. речь шла о 4-й миграции, которую я создал, и теперь я сделал около 10, что происходит с последними шестью, если я удаляю таблицу и пытаюсь воссоздать?) – Leahcim

+0

Советую добавить новую миграцию, чтобы отбросить таблицу, если необходимо.Возможно, вы должны поднять метод «ActiveRecord :: IrreversibleMigration» для down (откат). Но подумайте о том, чтобы восстановить ваш полный db в чистом виде, если вы считаете, что слишком много перепутали с вашими миграциями. –

Смежные вопросы