ruby on rails - remove - ¿Cómo crear una migración para eliminar un índice solo si existe, en lugar de lanzar una excepción si no lo hace?
rollback migration rails (1)
Puedes usar index_exists?
método dentro de su migración para probar si el índice que necesita eliminar está realmente allí.
Eche un vistazo a la documentación aquí: http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/index_exists%3F
No lo he probado, pero deberías poder usar algo como esto:
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
Aunque, por apariencia, ¿realmente solo quieres crearlos si no existen? Esto podría ser más apropiado para su migración:
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
En este momento, la migración actual puede fallar, si la tabla de books
no tiene campos created_at
o 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
toma alguna de las opciones para proceder silenciosamente si no puede eliminar el índice en lugar de generar un error?