2009-11-05 20 views
24

Piszę generator migracji dla wtyczki, którą piszę i muszę być w stanie znaleźć unikalne indeksy tabeli, dzięki czemu mogę zmodyfikować istniejące unikalne indeksy, aby stać się złożonym unikalnym indeksem. Próbowałem znaleźć sposób, aby uzyskać dostęp do indeksów tabela z ActiveRecord. Byłem w stanie znaleźć metodę ActiveRecord :: ConnectionAdapters :: PostgreSQLAdapter :: indexes, ale niestety jest ona dostępna tylko dla PosgreSQLAdapter. Muszę być w stanie obsługiwać inne główne bazy danych.ActiveRecord znajdowanie istniejących indeksów tabel

Najpierw przeglądam plik schema.rb, aby znaleźć indeksy, na początku działało, ale wkrótce zrozumiałem, że to była zła strategia.

Myślałem, że jeśli ActiveRecord nie zapewnia możliwości tego dla wielu adapterów baz danych, być może będę w stanie zapisać zapytania specyficzne dla adaptera w celu pobrania informacji o indeksie z tabeli. Jeśli potrzebuję uciekać się do tej metody, jaki byłby dobry sposób na określenie używanego adaptera?

Jeśli ktoś wie, w jaki sposób uzyskać ActiveRecord, aby wyświetlić informacje o indeksie tabeli, które byłyby idealne.

+1

Jedynym sposobem mogę myśleć, aby zrobić to teraz jest z pomocą ActiveRecord :: SchemaDumper.dump Problemem jest to, że zrzuca aktualny schemat do $ stdout i nie wiem, jak robić i że przekonwertuj wynik na ciąg. Gdybym to wiedział, byłbym w stanie użyć kodu z mojego pierwszego podejścia do czytania schematu.rb. Czy ktoś wie, jak przechwycić $ stdout za coś, co zostało napisane w bloku? Na przykład to nie działa: schema_str = IO :: open (2) {ActiveRecord :: SchemaDumper.dump} .read –

+0

Rozumiem, że to pytanie jest starożytne, ale miałem dokładnie ten sam problem, próbując zmusić SchemaDumper do zrzutu do ciąg znaków. W końcu znalazłem odpowiedź i opublikuję ją na wypadek, gdyby ktoś inny miał ten problem: 'schema_rb_as_string = ActiveRecord :: SchemaDumper.dump (ActiveRecord :: Base.connection, StringIO.new) .string' – MothOnMars

Odpowiedz

54

ten współpracuje z MySQL, PostgreSQL i SQLite3:

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

Ale myślę, że to tylko daje Ci specjalnie utworzone indeksy.

Ponadto, aby dowiedzieć się, która karta jest w użyciu:

ActiveRecord::Base.connection.class 
+0

działa z postgresami także – nikola

+0

Oto link: http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/PostgreSQLAdapter.html#method-i-indexes – Juguang

12

właśnie aktualizacja dla czystszego inspekcji. Ponieważ miałem wiele stołów, trudno było znaleźć konkretne rzeczy.

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 

To będzie szybka konfiguracja.

+1

To jest świetna odpowiedź. Znacznie czystsze niż przyjęta odpowiedź. – Lorenz

+0

To było świetne, dzięki! – Aeramor

Powiązane problemy