回答

收藏

ActiveRecord查找现有表索引

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

我正在为我正在写的插件编写迁移生成器,我需要能够找到表具有的唯一索引,以便可以将现有的唯一索引修改为复合唯一索引。我一直在尝试找到一种方法来访问表具有ActiveRecord的索引。我只能找到ActiveRecord
1 v* b. L3 x0 J; I' e0 U0 z0 o:: ConnectionAdapters :: PostgreSQLAdapter ::2 e. Z' x9 @- _2 B5 c" D
indexes方法,但是不幸的是,这仅适用于PosgreSQLAdapter。我需要能够支持其他主要数据库。1 K4 h) I  p2 E9 E" ?# Q
我首先对schema.rb文件进行grep查找以找到索引,但起初它是可行的,但是我很快意识到这是一个错误的策略。: {% R7 L* ^) U4 B. c
我当时在想,如果ActiveRecord无法为多个数据库适配器提供执行此操作的方法,则我可能能够编写适配器特定的查询以从表中检索索引信息。如果需要使用此方法,那么确定使用的适配器的好方法是什么?
$ E2 T# u  ?5 s2 o$ s& k% D如果有人知道一种使ActiveRecord列出表索引信息的方法,那将是理想的选择。
; t0 `6 E5 z% `' P) n: H, S2 i: K) j6 O               
/ [8 O" X  r( k; W解决方案:9 N" J2 v, V( I$ G
               
8 D& g5 d' Z  ^( k$ F6 l5 z4 S$ p1 @8 f% U, d! x/ }
3 @8 r# b' P, `, e
                这适用于MySQL,SQLite3和Postgres:" q/ m6 n! M: v* e2 @& m' i
ActiveRecord::Base.connection.tables.each do |table|
: r1 Q" c8 B0 T0 R    puts ActiveRecord::Base.connection.indexes(table).inspect" t! K- R+ q8 t: \& ?3 r! k) |% e
end
- U+ U# L2 k$ j* s. ^  y9 X+ X但是我认为它只能为您专门创建的索引。4 D$ I+ r  H2 i! w' X  p& R
另外,要找出正在使用的适配器:! O$ I6 b( v  W) ~
ActiveRecord::Base.connection.class
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则