ruby on rails - migrations - Comprueba si existe una tabla en Rails
remove migration rails (4)
Tengo una tarea de rake que no funcionará a menos que exista una tabla. Estoy trabajando con más de 20 ingenieros en un sitio web, así que quiero asegurarme de que hayan migrado la tabla antes de que puedan hacer una tarea de rake que llene esa tabla respectiva.
¿AR tiene un método como Table.exists
? ¿Cómo puedo asegurarme de que hayan migrado la tabla con éxito?
Descubrí esto mientras intentaba eliminar una tabla mediante una migración:
drop_table :kittens if (table_exists? :kittens)
ActiveRecord::Migration.drop_table :kittens if (ActiveRecord::Base.connection.table_exists? :kittens)
funciona para Rails 3.2
Esta forma más simple estará disponible en Rails 5:
drop_table :kittens, if_exists: true
Referencia: https://github.com/rails/rails/pull/16366
Y aquí está el CHANGELOG Rails 5 ActiveRecord:
Introduzca la opción: if_exists para drop_table.
Ejemplo:
drop_table(:posts, if_exists: true)
Eso se ejecutaría:
DROP TABLE IF EXISTS posts
Si la tabla no existe, if_exists: false (el valor predeterminado) genera una excepción, mientras que if_exists: true no hace nada.
En Rails 5, la API se volvió explícita con respecto a tablas / vistas , colectivamente fuentes de datos .
# Tables and views
ActiveRecord::Base.connection.data_sources
ActiveRecord::Base.connection.data_source_exists? ''kittens''
# Tables
ActiveRecord::Base.connection.tables
ActiveRecord::Base.connection.table_exists? ''kittens''
# Views
ActiveRecord::Base.connection.views
ActiveRecord::Base.connection.view_exists? ''kittens''
En Rails 2, 3 y 4, la API trata de tablas .
# Listing of all tables and views
ActiveRecord::Base.connection.tables
# Checks for existence of kittens table/view (Kitten model)
ActiveRecord::Base.connection.table_exists? ''kittens''
Obtener el estado de las migraciones:
# Tells you all migrations run
ActiveRecord::Migrator.get_all_versions
# Tells you the current schema version
ActiveRecord::Migrator.current_version
Si necesita más API para migraciones o metadatos, consulte:
- ActiveRecord::SchemaMigration
esta es la claseActiveRecord::Base
para la tablaschema_migrations
- ActiveRecord::Migrator
donde toda la acción ocurre cuando se ejecutan las migraciones
incluso si la tabla no existe:
modelo Kitten
, mesa esperada kittens
carriles 3:
Kitten.table_exists? # => falso
Rails 5.1
if ActiveRecord::Base.connection.data_source_exists? ''table_name''
drop_table :table_name
end
o
drop_table :table_name, if_exists: true