J'ai une tâche de rake qui ne fonctionnera que si une table existe. Je travaille avec plus de 20 ingénieurs sur un site Web. Je veux donc m'assurer qu'ils ont bien migré la table avant de pouvoir effectuer une tâche de commission qui remplira cette table.
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 devenu explicite pour les tables/vues , collectivement 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 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, voir:
ActiveRecord::Base
pour la table schema_migrations
même si la table n'existe pas:
modèle Kitten
, table attendue kittens
Rails 3:
Kitten.table_exists? # => faux
Je l'ai découvert en essayant 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
Ce formulaire 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 du journal Rails 5 ActiveRecord:
Introduisez 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 (valeur par défaut) déclenche une exception, tandis 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
La bonne façon de faire est Model.table_exists?
class Dog < ApplicationRecord
# something
end
do_something if Dog.table_exists?