回答

收藏

ActiveRecord查找现有表索引

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

我正在为我正在写的插件编写迁移生成器,我需要能够找到表具有的唯一索引,以便可以将现有的唯一索引修改为复合唯一索引。我一直在尝试找到一种方法来访问表具有ActiveRecord的索引。我只能找到ActiveRecord; @6 t9 y4 J0 y2 }: g) [
:: ConnectionAdapters :: PostgreSQLAdapter ::
2 T3 n* t1 k3 Gindexes方法,但是不幸的是,这仅适用于PosgreSQLAdapter。我需要能够支持其他主要数据库。
/ v8 k0 `# `7 K: X我首先对schema.rb文件进行grep查找以找到索引,但起初它是可行的,但是我很快意识到这是一个错误的策略。' N% R5 U) ?3 ^
我当时在想,如果ActiveRecord无法为多个数据库适配器提供执行此操作的方法,则我可能能够编写适配器特定的查询以从表中检索索引信息。如果需要使用此方法,那么确定使用的适配器的好方法是什么?
7 {" U" `# y; e2 R8 U如果有人知道一种使ActiveRecord列出表索引信息的方法,那将是理想的选择。
9 a2 Y* [0 f0 Z                , t% V; X" @7 r( c
解决方案:
: x, a6 e& T" r/ k! E) g                ; A. O( \3 s4 c0 `( L) R" G
3 ~0 b( J9 i: t) n
7 N+ ^0 x# a7 h1 i/ `/ @7 T- j5 a
                这适用于MySQL,SQLite3和Postgres:
7 C: S4 E  N5 H& `ActiveRecord::Base.connection.tables.each do |table|* r5 z! w) e' U3 e: [1 @5 p
    puts ActiveRecord::Base.connection.indexes(table).inspect6 G* R) q1 F+ _8 {. [
end& V5 e$ N& W. Y/ D# R; Q0 z
但是我认为它只能为您专门创建的索引。
3 D) T3 z& K+ z另外,要找出正在使用的适配器:
: M' o+ R6 m/ d9 aActiveRecord::Base.connection.class
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则