run remove rails migrations data create column ruby-on-rails ruby-on-rails-4 rails-migrations

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?