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::Base
pour la table schema_migrations
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