Vérifier si une table existe dans Rails

J’ai une tâche qui ne fonctionnera pas à moins qu’une table existe. Je travaille avec plus de 20 ingénieurs sur un site Web, je veux donc m’assurer qu’ils ont migré la table avant de pouvoir effectuer une tâche de rake qui remplira cette table respective.

Est-ce que AR a une méthode telle que Table.exists ? Comment puis-je m’assurer qu’ils ont migré la table avec succès?

Dans Rails 5, l’ API est devenue explicite en ce qui concerne les tables / vues , collectivement les sources de données .

 # 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' 

Dans Rails 2, 3 et 4, l’API concerne les tables .

 # 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' 

Obtenir le statut des migrations:

 # Tells you all migrations run ActiveRecord::Migrator.get_all_versions # Tells you the current schema version ActiveRecord::Migrator.current_version 

Si vous avez besoin de plus d’API pour les migrations ou les métadonnées, consultez:

  • ActiveRecord :: SchemaMigration
    c’est la classe ActiveRecord::Base pour la table schema_migrations
  • ActiveRecord :: Migrator
    où toute l’action se produit lorsque les migrations sont exécutées

même si la table n’existe pas:

modèle Kitten , attendons les kittens table rails 3:

Kitten.table_exists? # => faux

J’ai découvert cela pendant que j’essayais de supprimer une table via une migration:

 drop_table :kittens if (table_exists? :kittens) ActiveRecord::Migration.drop_table :kittens if (ActiveRecord::Base.connection.table_exists? :kittens) 

fonctionne pour Rails 3.2

Cette forme plus simple sera disponible dans Rails 5:

 drop_table :kittens, if_exists: true 

Référence: https://github.com/rails/rails/pull/16366

Et voici le CHANGELOG de Rails 5 ActiveRecord:

Présentez l’option: if_exists pour drop_table.

Exemple:

 drop_table(:posts, if_exists: true) 

Cela exécuterait:

 DROP TABLE IF EXISTS posts 

Si la table n’existe pas, if_exists: false (la valeur par défaut) déclenche une exception alors que if_exists: true ne fait rien.

Rails 5.1

 if ActiveRecord::Base.connection.data_source_exists? 'table_name' drop_table :table_name end 

ou

 drop_table :table_name, if_exists: true