回答

收藏

ActiveRecord查找现有表索引

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

我正在为我正在写的插件编写迁移生成器,我需要能够找到表具有的唯一索引,以便可以将现有的唯一索引修改为复合唯一索引。我一直在尝试找到一种方法来访问表具有ActiveRecord的索引。我只能找到ActiveRecord; e6 C+ K; @3 a3 Y0 C; w( c1 V
:: ConnectionAdapters :: PostgreSQLAdapter ::
+ S: E# R2 P% p) A6 h  gindexes方法,但是不幸的是,这仅适用于PosgreSQLAdapter。我需要能够支持其他主要数据库。" D) m/ s$ X" N: X3 m
我首先对schema.rb文件进行grep查找以找到索引,但起初它是可行的,但是我很快意识到这是一个错误的策略。
0 q" ?  h4 y6 e. {( a" t4 ?我当时在想,如果ActiveRecord无法为多个数据库适配器提供执行此操作的方法,则我可能能够编写适配器特定的查询以从表中检索索引信息。如果需要使用此方法,那么确定使用的适配器的好方法是什么?
2 q$ y! \  |9 G9 `! A如果有人知道一种使ActiveRecord列出表索引信息的方法,那将是理想的选择。& Z8 e8 z5 j1 E8 v
                " X" u) ]! v8 I
解决方案:
' N3 c+ |1 I# B0 d: v. ]2 b               
1 U7 V7 P# I$ Y; A8 o4 @( |0 t* x0 S! X) P, o' ?' @# i- J0 s

9 q. a8 S5 C+ }+ J* \& g/ \- T9 G7 n5 j                这适用于MySQL,SQLite3和Postgres:
/ h7 W7 v2 u  sActiveRecord::Base.connection.tables.each do |table|& c) h9 l2 A' w5 N, r/ h  a( L  M* j
    puts ActiveRecord::Base.connection.indexes(table).inspect( y- {* Q* O/ j5 e/ E
end
0 A- G# q  u1 d但是我认为它只能为您专门创建的索引。
, x% w& M) W" b2 P9 J另外,要找出正在使用的适配器:' F, l! G9 x4 D0 ]7 D$ @; x9 R+ c
ActiveRecord::Base.connection.class
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则