2009-11-05 4 views
24

필자가 쓰는 플러그인의 마이그레이션 생성기를 작성 중이며 고유 한 인덱스가 테이블에 있는지 확인할 수 있어야 기존 고유 인덱스가 복합 고유 인덱스가 될 수 있습니다. ActiveRecord를 사용하여 테이블에있는 인덱스에 액세스하는 방법을 찾으려고했습니다. ActiveRecord :: ConnectionAdapters :: PostgreSQLAdapter :: indexes 메서드 만 찾을 수 있었지만 불행히도 PosgreSQLAdapter에서만 사용할 수 있습니다. 다른 주요 데이터베이스를 지원할 수 있어야합니다.ActiveRecord 기존 테이블 인덱스를 찾는

먼저 schema.rb 파일을 grepping하여 색인을 찾았습니다. 처음에는이 방법이 유용했지만 곧 이것이 나쁜 전략이라는 것을 깨달았습니다.

ActiveRecord가 여러 데이터베이스 어댑터에서이 작업을 수행 할 수있는 방법을 제공하지 않는다면 어댑터 별 쿼리를 작성하여 테이블에서 인덱스 정보를 검색 할 수 있다고 생각했습니다. 이 방법을 사용해야 할 경우 사용중인 어댑터를 판별하는 좋은 방법은 무엇입니까?

이상적인 테이블 인덱스 정보를 나열하는 ActiveRecord를 얻는 방법을 알고있는 사람.

+1

있는 유일한 방법은의 도움을받는 것이다 액티브 :: 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를, 그리고 포스트 그레스와 함께 작동 :

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

하지만 그것은 단지 당신이 특별히 만든 인덱스를 제공합니다 생각합니다. 또한

는 사용중인 어댑터를 찾을 수 있습니다 : 청소기 검사

ActiveRecord::Base.connection.class 
+0

역시 포스트 그레스와 함께 작동합니다 – 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

관련 문제