2009-11-05 2 views
24

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

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

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

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

+1

Единственный способ, которым я могу думать, чтобы сделать это прямо сейчас с помощью ActiveRecord :: SchemaDumper.dump Проблема заключается в том, что это выводит текущую схему на $ стандартный вывод, и я не знаю, как захватить, что и преобразовать вывод в строку. Если бы я знал это, я смог бы использовать код из своего первого подхода к чтению schema.rb. Кто-нибудь знает, как записать $ stdout для того, что было написано в блоке? Например, это не работает: schema_str = IO :: open (2) {ActiveRecord :: SchemaDumper.dump} .read –

+0

Я понимаю, что этот вопрос древний, но у меня была такая же проблема, что и попытка заставить SchemaDumper сбрасывать строка. Я, наконец, нашел ответ, и я отправлю его, если у кого-то еще будет эта проблема: 'schema_rb_as_string = ActiveRecord :: SchemaDumper.dump (ActiveRecord :: Base.connection, StringIO.new) .string' – MothOnMars

ответ

54

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

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

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

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

ActiveRecord::Base.connection.class 
+0

также работает с postgres – nikola

+0

Вот ссылка: http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/PostgreSQLAdapter.html#method-i-indexes – Juguang

12

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

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 

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

+1

Это отличный ответ. Гораздо чище, чем принятый ответ. – Lorenz

+0

Это было здорово, спасибо! – Aeramor

Смежные вопросы