我正在为我正在编写的插件编写迁移生成器,我需要能够找到表中的唯一索引,以便我可以修改现有的唯一索引以成为复合唯一索引。我一直试图找到一种方法来访问表与ActiveRecord的索引。我只能找到ActiveRecord :: ConnectionAdapters :: PostgreSQLAdapter :: indexes方法,但不幸的是,这只适用于PosgreSQLAdapter。我需要能够支持其他主要数据库。
我首先使用schema.rb文件来查找索引,这首先起作用,但我很快意识到这是一个糟糕的策略。
我在想如果ActiveRecord没有提供能够为多个数据库适配器执行此操作的方法,我可能能够编写特定于适配器的查询以从表中检索索引信息。如果我需要采用这种方法,那么确定正在使用的适配器的好方法是什么?
如果有人知道如何让ActiveRecord列出理想的表索引信息。
答案 0 :(得分:69)
这适用于MySQL,SQLite3和Postgres:
ActiveRecord::Base.connection.tables.each do |table|
puts ActiveRecord::Base.connection.indexes(table).inspect
end
但我认为它只会为您提供专门创建的索引。
另外,要找出正在使用的适配器:
ActiveRecord::Base.connection.class
答案 1 :(得分:20)
只是更清洁检查的更新。由于我有很多桌子,我发现很难找到特定的东西。
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
这将是快速设置。
答案 2 :(得分:4)
如果只想查看特定表的所有索引,可以执行以下操作:
ActiveRecord::Base.connection.indexes('my_table_name').map(&:name)
答案 3 :(得分:0)
以防万一,您有多个数据库,并且建议的ActiveRecord::Base.connection.indexes(table).inspect
不起作用,因为它指向其他数据库。您可以在Rails控制台中执行此操作。