回答

收藏

ActiveRecord查找现有表索引

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

我正在为我正在写的插件编写迁移生成器,我需要能够找到表具有的唯一索引,以便可以将现有的唯一索引修改为复合唯一索引。我一直在尝试找到一种方法来访问表具有ActiveRecord的索引。我只能找到ActiveRecord
8 Y& q0 u6 ]! v- x$ ^' b" |  T:: ConnectionAdapters :: PostgreSQLAdapter ::0 t, r. ?: S9 i% S7 p
indexes方法,但是不幸的是,这仅适用于PosgreSQLAdapter。我需要能够支持其他主要数据库。: H$ R! ^, B& q  L7 B
我首先对schema.rb文件进行grep查找以找到索引,但起初它是可行的,但是我很快意识到这是一个错误的策略。
9 h" T4 f& i3 t5 |) V6 D* ]我当时在想,如果ActiveRecord无法为多个数据库适配器提供执行此操作的方法,则我可能能够编写适配器特定的查询以从表中检索索引信息。如果需要使用此方法,那么确定使用的适配器的好方法是什么?" n7 b( R. o* u2 d) @- Z  [1 L% o4 ]
如果有人知道一种使ActiveRecord列出表索引信息的方法,那将是理想的选择。/ s; \7 X; I# ~- X
               
7 d0 S% [8 p* V; I5 Z解决方案:- }- `, X6 [3 B% @! W
               
4 Z- ?2 W4 Q# j3 Q* R
4 K# _2 H5 o2 E& Z" i4 _0 T
9 {' n9 B8 p% t, O4 ~7 ]                这适用于MySQL,SQLite3和Postgres:
' m( X8 f9 k; ~& }" r# F& {ActiveRecord::Base.connection.tables.each do |table|
8 n' |- ?' l2 j& z3 }# g( V* [    puts ActiveRecord::Base.connection.indexes(table).inspect3 O) K/ K. I8 _: p1 o+ ^/ j
end, H" Q* R2 ~' v5 t! U) C
但是我认为它只能为您专门创建的索引。2 V' {* ^* U  b2 L- |
另外,要找出正在使用的适配器:
6 Q. L, X3 A) J# n9 g% m2 Y4 qActiveRecord::Base.connection.class
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则