Проверьте, существует ли таблица в Rails


У меня есть грабли задача, которая не будет работать, если таблица существует. Я работаю с более чем 20 инженерами на веб-сайте, поэтому я хочу убедиться, что они перенесли таблицу, прежде чем они смогут выполнить задачу rake, которая заполнит эту соответствующую таблицу.

есть ли у AR такой метод, как Table.exists? Как я могу убедиться, что они успешно перенесли таблицу?

4 152

4 ответа:

в рельсы 5 то API стал явным в отношении таблиц / представлений в совокупности источники данных.

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

в Rails 2, 3 & 4 API о таблицы.

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

получение статуса миграции:

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

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

если вам нужно больше API для миграции или метаданных см.:

даже если таблица не существует:

модель Kitten, ожидал стол kittens рельсы 3:

котенок.table_exists? # = > false

я обнаружил это, когда пытался удалить таблицу с помощью миграции:

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

работает для рельсов 3.2

эта простая форма станет доступна в Rails 5:

drop_table :kittens, if_exists: true

Ссылка:https://github.com/rails/rails/pull/16366

а вот рельсы 5 у ActiveRecord список изменений:

вводим :параметра if_exists для выполняться инструкция drop_table.

пример:

drop_table(:posts, if_exists: true)

что бы выполнить:

DROP TABLE IF EXISTS posts

если таблица не существует, if_exists: false (по умолчанию) вызывает исключение, тогда как if_exists: true ничего не делает.

рельсы 5.1

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

или

drop_table :table_name, if_exists: true