Sprawdź, czy w Rails istnieje tabela

Mam zadanie prowizji, które nie będzie działać, jeśli tabela nie istnieje. Pracuję z ponad 20 inżynierów na stronie internetowej, więc chcę się upewnić, że mają migracji tabeli, zanim będą mogli zrobić zadanie prowizji, które będą wypełniać tę tabelę.

Czy AR ma metodę taką jak Table.exists? Jak mogę się upewnić, że pomyślnie przeszli migrację tabeli?

Author: jackyalcine, 2011-07-06

4 answers

W Rails 5 API stało się jawne w odniesieniu do tabel/widoków , zbiorczo źródeł danych .

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

W Rails 2, 3 i 4 API jest o tabele .

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

Uzyskanie statusu migracji:

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

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

Jeśli potrzebujesz więcej interfejsów API do migracji lub metadanych, Zobacz:

 272
Author: captainpete,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-29 02:24:59

Nawet jeśli tabela nie istnieje:

Model Kitten, oczekiwana tabela kittens rails 3:

Kotek.table_exists? # = > false
 54
Author: alexey_the_cat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-31 14:48:58

Odkryłem to podczas próby usunięcia tabeli poprzez migrację:

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

Działa na Rails 3.2

Ta prostsza forma będzie dostępna w Rails 5:

drop_table :kittens, if_exists: true

Numer referencyjny: https://github.com/rails/rails/pull/16366

A oto Rails 5 ActiveRecord ' s CHANGELOG :

Wprowadź opcję: if_exists dla drop_table.

Przykład:

drop_table(:posts, if_exists: true)

To wykonałoby:

DROP TABLE IF EXISTS posts

Jeśli tabela nie istnieje, if_exists: false (domyślnie) wyświetla wyjątek, podczas gdy if_exists: true nic nie robi.

 28
Author: kangkyu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-09 10:39:25

Rails 5.1

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

Lub

drop_table :table_name, if_exists: true
 6
Author: Vitor Oliveira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-16 18:14:20