2009-11-05 23 views
24

Tôi đang viết trình tạo di chuyển cho một plugin mà tôi đang viết và tôi cần tìm các chỉ mục duy nhất mà bảng có để tôi có thể sửa đổi các chỉ mục duy nhất để trở thành chỉ mục tổng hợp duy nhất. Tôi đã cố gắng để tìm một cách để truy cập vào những gì chỉ mục một bảng có với ActiveRecord. Tôi chỉ có thể tìm ActiveRecord :: ConnectionAdapters :: PostgreSQLAdapter :: chỉ số phương pháp, nhưng tiếc là điều này chỉ có sẵn cho PosgreSQLAdapter. Tôi cần để có thể hỗ trợ các cơ sở dữ liệu lớn khác.ActiveRecord tìm các chỉ mục bảng hiện có

Tôi lần đầu tiên grepping tệp schema.rb để tìm các chỉ mục, điều này làm việc lúc đầu, nhưng tôi sớm nhận ra đây là một chiến lược xấu. Tôi đã nghĩ rằng nếu ActiveRecord không cung cấp một phương tiện để có thể làm điều này cho nhiều bộ điều hợp cơ sở dữ liệu, tôi có thể viết các truy vấn bộ điều hợp cụ thể để lấy thông tin chỉ mục từ một bảng. Nếu tôi cần phải sử dụng phương pháp này thì điều gì sẽ là một cách tốt để xác định bộ điều hợp đang sử dụng?

Nếu ai đó biết cách để ActiveRecord liệt kê thông tin chỉ mục bảng sẽ lý tưởng.

+1

Cách duy nhất tôi có thể nghĩ để làm điều này ngay bây giờ là với sự trợ giúp của ActiveRecord :: SchemaDumper.dump Vấn đề là việc này sẽ lược đồ hiện tại thành $ stdout và tôi không biết cách nắm bắt điều đó và chuyển đổi đầu ra thành chuỗi. Nếu tôi biết điều đó, tôi sẽ có thể sử dụng mã từ cách tiếp cận đầu tiên của tôi về đọc schema.rb. Bất cứ ai cũng biết làm thế nào để nắm bắt $ stdout cho một cái gì đó đã được viết trong một khối? Ví dụ điều này không hoạt động: schema_str = IO :: mở (2) {ActiveRecord :: SchemaDumper.dump} .read –

+0

Tôi nhận ra câu hỏi này là cổ xưa, nhưng tôi đã có cùng một vấn đề cố gắng để có được SchemaDumper để đổ một chuỗi. Cuối cùng tôi đã tìm thấy câu trả lời và tôi sẽ đăng câu trả lời trong trường hợp bất kỳ ai khác có vấn đề này: 'schema_rb_as_string = ActiveRecord :: SchemaDumper.dump (ActiveRecord :: Base.connection, StringIO.new) .string' – MothOnMars

Trả lời

54

này làm việc với MySQL, SQLite3 và Postgres:

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

Nhưng tôi nghĩ rằng nó chỉ mang đến cho bạn các chỉ số bạn đặc biệt tạo ra.

Ngoài ra, để tìm ra các bộ chuyển đổi được sử dụng:

ActiveRecord::Base.connection.class 
+0

hoạt động với postgres quá – nikola

+0

Đây là liên kết: http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/PostgreSQLAdapter.html#method-i-indexes – Juguang

12

Chỉ cần một bản cập nhật để kiểm tra sạch hơn. Vì tôi có nhiều bảng nên tôi thấy khó tìm kiếm các nội dung cụ thể.

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 

Điều này sẽ được thiết lập nhanh.

+1

Đây là một câu trả lời tuyệt vời. Sạch hơn nhiều so với phản ứng được chấp nhận. – Lorenz

+0

Điều này thật tuyệt vời, cảm ơn! – Aeramor

Các vấn đề liên quan