Проверьте, существует ли таблица в Rails - PullRequest
164 голосов
/ 06 июля 2011

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

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

Ответы [ 5 ]

292 голосов
/ 06 июля 2011

В Rails 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 для миграции или метаданных, см .:

54 голосов
/ 31 января 2012

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

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

Kitten.table_exists?# => false

32 голосов
/ 29 мая 2015

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

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 ничего не делает.

6 голосов
/ 16 декабря 2016

Рельсы 5.1

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

или

drop_table :table_name, if_exists: true
0 голосов
/ 10 октября 2018

Правильный способ сделать это - Model.table_exists?

class Dog < ApplicationRecord
  # something
end

do_something if Dog.table_exists?
...