205 Stimmen

Prüfen, ob eine Tabelle in Rails existiert

Ich habe eine Rake-Aufgabe, die nicht funktioniert, wenn keine Tabelle vorhanden ist. Ich arbeite mit mehr als 20 Ingenieuren an einer Website und möchte sicherstellen, dass sie die Tabelle migriert haben, bevor sie eine Rake-Aufgabe ausführen können, die die entsprechende Tabelle auffüllt.

Verfügt AR über eine Methode wie Table.exists ? Wie kann ich sicherstellen, dass sie die Tabelle erfolgreich migriert haben?

346voto

captainpete Punkte 6042

In Rails 5 wird die API wurde bezüglich Tabellen/Views explizit kollektiv Datenquellen .

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

In Rails 2, 3 & 4 ist die API über Tabellen .

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

Abrufen des Status von Migrationen:

# Tells you all migrations run
ActiveRecord::Migrator.get_all_versions

# Tells you the current schema version
ActiveRecord::Migrator.current_version

Wenn Sie weitere APIs für Migrationen oder Metadaten benötigen, sehen Sie bitte nach:

64voto

alexey_the_cat Punkte 1713

Auch wenn die Tabelle nicht vorhanden ist:

Modell Kitten , erwartete Tabelle kittens Schienen 3:

Kitten.table_exists? #=> false

39voto

kangkyu Punkte 4174

Ich habe dies herausgefunden, als ich versuchte, eine Tabelle über eine Migration zu entfernen:

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

funktioniert für Rails 3.2

Dieses einfachere Formular wird in Rails 5 zur Verfügung stehen:

drop_table :kittens, if_exists: true

Referenz: https://github.com/rails/rails/pull/16366

Und hier ist die Rails 5 ActiveRecord's CHANGELOG :

Einführung der Option :if_exists für drop_table.

drop_table(:posts, if_exists: true)

Das würde ausgeführt:

DROP TABLE IF EXISTS posts

Wenn die Tabelle nicht existiert, löst if_exists: false (die Standardeinstellung) eine Ausnahme aus, während if_exists: true nichts bewirkt.

14voto

Vitor Oliveira Punkte 384

Rails 5.1

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

oder

drop_table :table_name, if_exists: true

3voto

Juan Furattini Punkte 690

Der richtige Weg, dies zu tun ist Model.table_exists?

class Dog < ApplicationRecord
  # something
end

do_something if Dog.table_exists?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X