Подтвердить что ты не робот

Как создать миграцию для удаления индекса только в том случае, если он существует, а не для исключения исключения, если это не так?

В настоящий момент текущая миграция может завершиться неудачей, если таблица 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 любые параметры для молчания, если ему не удастся удалить индекс, а не поднимать ошибку?

4b9b3361

Ответ 1

Вы можете использовать метод 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