Подтвердить что ты не робот

ActiveRecord находит существующие табличные индексы

Я пишу генератор миграции для плагина, который я пишу, и мне нужно уметь находить, какие уникальные индексы имеют таблица, поэтому я могу изменить существующие уникальные индексы, чтобы стать составным уникальным индексом. Я пытался найти способ получить доступ к индексам таблицы с помощью ActiveRecord. Я только смог найти метод ActiveRecord:: ConnectionAdapters:: PostgreSQLAdapter:: indexes, но, к сожалению, это доступно только для PosgreSQLAdapter. Мне нужно иметь возможность поддерживать другие основные базы данных.

Сначала я нашел файл schema.rb, чтобы найти индексы, это сработало сначала, но вскоре я понял, что это была плохая стратегия.

Я думал, что если ActiveRecord не предоставляет средства для этого для нескольких адаптеров базы данных, я могу написать конкретные запросы адаптера для извлечения информации индекса из таблицы. Если мне нужно прибегнуть к этому методу, что было бы хорошим способом определить используемый адаптер?

Если кто-то знает способ заставить ActiveRecord отображать информацию индекса таблицы, которая была бы идеальной.

4b9b3361

Ответ 1

Это работает с MySQL, SQLite3 и Postgres:

ActiveRecord::Base.connection.tables.each do |table|
    puts ActiveRecord::Base.connection.indexes(table).inspect
end

Но я думаю, что это дает вам только те индексы, которые вы создали.

Кроме того, чтобы узнать, какой адаптер используется:

ActiveRecord::Base.connection.class

Ответ 2

Просто обновление для более чистого осмотра. Поскольку у меня было много таблиц, мне было трудно искать конкретные вещи.

  ActiveRecord::Base.connection.tables.each do |table|
  indexes = ActiveRecord::Base.connection.indexes(table)
  if indexes.length > 0
    puts "====>  #{table} <===="
    indexes.each do |ind|
      puts "----> #{ind.name}"
    end
    puts "====>  #{table} <===="
    2.times{ puts ''}
  end
end

Это будет быстрой настройкой.