回答

收藏

ActiveRecord查找现有表索引

技术问答 技术问答 328 人阅读 | 0 人回复 | 2023-09-14

我正在为我正在写的插件编写迁移生成器,我需要能够找到表具有的唯一索引,以便可以将现有的唯一索引修改为复合唯一索引。我一直在尝试找到一种方法来访问表具有ActiveRecord的索引。我只能找到ActiveRecord: b4 ?) R. m# P2 S6 x8 X5 p
:: ConnectionAdapters :: PostgreSQLAdapter ::4 r3 e& h5 e) L+ H  C! t" G
indexes方法,但是不幸的是,这仅适用于PosgreSQLAdapter。我需要能够支持其他主要数据库。: G5 l# }2 i4 n9 J; T! u
我首先对schema.rb文件进行grep查找以找到索引,但起初它是可行的,但是我很快意识到这是一个错误的策略。
9 p: z: `& F8 n& c" j' Y我当时在想,如果ActiveRecord无法为多个数据库适配器提供执行此操作的方法,则我可能能够编写适配器特定的查询以从表中检索索引信息。如果需要使用此方法,那么确定使用的适配器的好方法是什么?! Q: `- l% d& [1 n& _5 G5 J* b
如果有人知道一种使ActiveRecord列出表索引信息的方法,那将是理想的选择。  V% _; i* A  d1 I3 K  @1 X
               
7 e: L6 N! {; f; \+ L3 f解决方案:$ t0 f8 H" v6 @& }# m
               
% @! }- v  \, w$ ^" {8 ]1 t, j- h; r- i" U
: N0 ]  B. z/ [" m% q
                这适用于MySQL,SQLite3和Postgres:
/ m" B; D# O; m9 N, h  lActiveRecord::Base.connection.tables.each do |table|; h! ]4 F3 s' C. f( K. g2 ~
    puts ActiveRecord::Base.connection.indexes(table).inspect
% t9 E! F9 F; {$ }6 u" W5 Zend
: E3 l# f3 y7 @: j但是我认为它只能为您专门创建的索引。7 S: U. Y# _8 c) ~( u' s. X
另外,要找出正在使用的适配器:
* M# D, b; y8 f/ yActiveRecord::Base.connection.class
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则