开发者

ActiveRecord finding existing table indexes

I am writing a migration generator for a plugin I am writing and I need to t开发者_Python百科o be able to find what unique indexes a table has so I can modify existing unique indexes to become a composite unique index. I have been trying to find a way to access what indexes a table has with ActiveRecord. I have only been able to find ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::indexes method, but unfortunately this is only available for the PosgreSQLAdapter. I need to be able to support the other major databases.

I first grepping the schema.rb file to find the indexes, this worked at first, but I soon realized this was a bad strategy.

I was thinking that if ActiveRecord does not provide a means to be able to do this for multiple database adapters, I may be able to write adapter specific queries to retrieve the index information from a table. If I need to resort to this method what would be a good way to determine the adapter in use?

If someone knows of a way to get ActiveRecord to list table index information that would be ideal.


This works with MySQL, SQLite3, and Postgres:

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

But I think it only gives you the indexes you specifically created.

Also, to find out which adapter is in use:

ActiveRecord::Base.connection.class


Just an update for cleaner inspection. As I had many tables I was finding it difficult to search for specific stuffs.

  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

This will be of quick setup.


If you just want to see all the indexes for a particular table you can do:

ActiveRecord::Base.connection.indexes('my_table_name').map(&:name)


Just in case you have multiple DBs and the proposed ActiveRecord::Base.connection.indexes(table).inspect doesn't work because it is pointing to other DBs. You can do this in your rails console.

  • Find the model you care, let's say "User"
  • User.connection.indexes("users").inspect
  • profit
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜