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.
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 –
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