web-dev-qa-db-fra.com

Vérifier si une table existe dans Rails

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?

157
thenengah

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:

281
captainpete

même si la table n'existe pas:

modèle Kitten, table attendue kittens Rails 3:

Kitten.table_exists? # => faux

54
alexey_the_cat

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.

29
kangkyu

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
5
Vitor Oliveira

La bonne façon de faire est Model.table_exists?

class Dog < ApplicationRecord
  # something
end

do_something if Dog.table_exists?
0
Juan Furattini