回答

收藏

ActiveRecord查找现有表索引

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

我正在为我正在写的插件编写迁移生成器,我需要能够找到表具有的唯一索引,以便可以将现有的唯一索引修改为复合唯一索引。我一直在尝试找到一种方法来访问表具有ActiveRecord的索引。我只能找到ActiveRecord
8 n# s3 T( z8 X6 {* o& H- b4 D:: ConnectionAdapters :: PostgreSQLAdapter ::
8 v4 X. l' b- v5 |indexes方法,但是不幸的是,这仅适用于PosgreSQLAdapter。我需要能够支持其他主要数据库。
0 X% Q& s' ]! d. i( U我首先对schema.rb文件进行grep查找以找到索引,但起初它是可行的,但是我很快意识到这是一个错误的策略。
8 }( j. M/ Y0 c; F我当时在想,如果ActiveRecord无法为多个数据库适配器提供执行此操作的方法,则我可能能够编写适配器特定的查询以从表中检索索引信息。如果需要使用此方法,那么确定使用的适配器的好方法是什么?9 N! C0 W2 y) D- V# g" ~
如果有人知道一种使ActiveRecord列出表索引信息的方法,那将是理想的选择。
# q0 a% `  ^4 d5 n: e               
+ o: V3 j. _) g4 z$ P4 }解决方案:
. K1 {5 ^5 g9 M5 N3 {" f               
, ^/ t3 {6 `& E  h3 L$ e- g& o! h, I2 d" f( i' V" C

( ~/ d4 [* Q5 v6 B6 |* Q- x                这适用于MySQL,SQLite3和Postgres:6 ?8 n& R0 Q! l( ^7 L4 `6 A
ActiveRecord::Base.connection.tables.each do |table|
6 ~2 Z* Y9 K6 a; d2 J4 \    puts ActiveRecord::Base.connection.indexes(table).inspect
: f  `& ]2 z( oend
$ J& e% v% _) k但是我认为它只能为您专门创建的索引。& q% @" |0 e, E6 X
另外,要找出正在使用的适配器:
0 X. T+ U2 `$ |ActiveRecord::Base.connection.class
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则