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

137

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

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

  • 11
    Шутка идет .. сколько инженеров нужно, чтобы перенести таблицу :)
  • 1
    На производстве 1. На постановке десятки и несколько раз каждый.
Показать ещё 2 комментария
Теги:
activerecord
rails-migrations

4 ответа

266
Лучший ответ

В Rails 5 API ActiveRecord:: SchemaMigration
это класс ActiveRecord::Base для таблицы schema_migrations

ActiveRecord:: Migrator
где все действия происходят при выполнении миграции.
  • 4
    ActiveRecord::Base.connection.table_exist 'users' проверит таблицу пользователей.
  • 0
    Приветствия @Codeglot, обновленный ответ, чтобы включить аргумент.
Показать ещё 5 комментариев
51

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

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

Kitten.table_exists? # = > false

  • 1
    это не работает
  • 1
    +1 - ПРИМЕЧАНИЕ: работает только для Rails 3 или выше.
Показать ещё 2 комментария
28

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

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

работает для Rails 3.2

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

drop_table :kittens, if_exists: true

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

И здесь Rails 5 ActiveRecord CHANGELOG:

Ввести параметр: if_exists для drop_table.

Пример:

drop_table(:posts, if_exists: true)

Это выполнит:

DROP TABLE IF EXISTS posts

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

  • 0
    Это не удастся, если таблица на самом деле является представлением, так как эта таблица будет существовать, но DROP TABLE не сможет ее удалить.
4

Rails 5.1

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

или

drop_table :table_name, if_exists: true
  • 2
    table_exists все еще работает в rails-5, но его поведение будет меняться только на проверку таблиц. Начиная с 5.0.1 он проверяет представления и таблицы. data_source_exists сохраняет это поведение, а table_exists будет меняться только на проверку таблиц.
  • 0
    Он не просит проверить таблицу на миграцию, он должен быть уверен, что таблица существует на грабли

Ещё вопросы

Сообщество Overcoder
Наверх
Меню