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?
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:
-
ActiveRecord::SchemaMigration
jest to klasaActiveRecord::Base
dla tabelischema_migrations
-
ActiveRecord::Migrator
gdzie cała akcja dzieje się, gdy migracje są uruchamiane
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:
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.
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
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