2014-02-15 2 views
24

Прямо сейчас, текущая миграция может потерпеть неудачу, если books таблица не имеет created_at или updated_at поля:Как создать миграцию, чтобы удалить индекс, только если он существует, вместо того, чтобы бросать исключение, если это не так?

class AddTimestampIndexes < ActiveRecord::Migration 
    def up 
    remove_index :books, :created_at 
    remove_index :books, :updated_at 

    add_index :books, :created_at 
    add_index :books, :updated_at 
    end 

    def down 
    remove_index :books, :created_at 
    remove_index :books, :updated_at 
    end 
end 

ли remove_index принимать какие-либо варианты молча действовать, если это не удается удалить индекс, а не поднимая ошибка?

ответ

41

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

Посмотрите на документацию здесь: http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/index_exists%3F

Я не проверял, но вы должны быть в состоянии использовать что-то вроде этого:

class AddTimestampIndexes < ActiveRecord::Migration 
    def up 
    remove_index :books, :created_at if index_exists?(:books, :created_at) 
    remove_index :books, :updated_at if index_exists?(:books, :updated_at) 

    add_index :books, :created_at 
    add_index :books, :updated_at 
    end 

    def down 
    remove_index :books, :created_at 
    remove_index :books, :updated_at 
    end 
end 

Хотя, судя по вещам , вы действительно хотите только создать их, если их не существует? Это может быть более подходящим для вашей миграции:

class AddTimestampIndexes < ActiveRecord::Migration 
    def up 
    add_index :books, :created_at unless index_exists?(:books, :created_at) 
    add_index :books, :updated_at unless index_exists?(:books, :updated_at) 
    end 

    def down 
    remove_index :books, :created_at 
    remove_index :books, :updated_at 
    end 
end 
Смежные вопросы