【问题标题】:ActiveRecord finding existing table indexesActiveRecord 查找现有表索引
【发布时间】:2010-12-13 15:02:23
【问题描述】:

我正在为我正在编写的插件编写迁移生成器,我需要能够找到表具有哪些唯一索引,以便我可以修改现有唯一索引以成为复合唯一索引。我一直在尝试找到一种方法来使用 ActiveRecord 访问表的索引。我只能找到 ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::indexes 方法,但不幸的是,这仅适用于 PosgreSQLAdapter。我需要能够支持其他主要数据库。

我首先通过 grep 查找 schema.rb 文件来查找索引,起初这很有效,但我很快意识到这是一个糟糕的策略。

我在想,如果 ActiveRecord 不提供能够为多个数据库适配器执行此操作的方法,我也许可以编写适配器特定的查询来从表中检索索引信息。如果我需要采用这种方法,那么确定正在使用的适配器的好方法是什么?

如果有人知道让 ActiveRecord 列出理想的表索引信息的方法。

【问题讨论】:

  • 我现在唯一能想到的方法是借助 ActiveRecord::SchemaDumper.dump 问题是这会将当前模式转储到 $stdout 并且我不知道如何捕获并将输出转换为字符串。如果我知道这一点,我将能够使用我第一种读取 schema.rb 的方法中的代码。任何人都知道如何为块中写入的内容捕获 $stdout 吗?例如这不起作用:schema_str = IO::open(2) { ActiveRecord::SchemaDumper.dump }.read
  • 我意识到这个问题很古老,但我在尝试让 SchemaDumper 转储到字符串时遇到了完全相同的问题。我终于找到了答案,如果其他人有这个问题,我会发布它:schema_rb_as_string = ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, StringIO.new).string

标签: sql ruby-on-rails database activerecord


【解决方案1】:

这适用于 MySQL、SQLite3 和 Postgres:

ActiveRecord::Base.connection.tables.each do |table|
    puts ActiveRecord::Base.connection.indexes(table).inspect
end

但我认为它只会为您提供您专门创建的索引。

另外,要找出正在使用的适配器:

ActiveRecord::Base.connection.class

【讨论】:

【解决方案2】:

只是为了更清洁的检查而更新。由于我有很多表,我发现很难搜索特定的东西。

  ActiveRecord::Base.connection.tables.each do |table|
  indexes = ActiveRecord::Base.connection.indexes(table)
  if indexes.length > 0
    puts "====>  #{table} <===="
    indexes.each do |ind|
      puts "----> #{ind.name}"
    end
    puts "====>  #{table} <===="
    2.times{ puts ''}
  end
end

这将是快速设置。

【讨论】:

  • 这是一个很好的答案。比接受的响应要干净得多。
  • &amp;&amp; nil 附加到最后,以使所有表数据静音each 返回。
【解决方案3】:

如果您只想查看特定表的所有索引,您可以这样做:

ActiveRecord::Base.connection.indexes('my_table_name').map(&:name)

【讨论】:

    【解决方案4】:

    以防万一您有多个数据库并且建议的ActiveRecord::Base.connection.indexes(table).inspect 不起作用,因为它指向其他数据库。您可以在 Rails 控制台中执行此操作。

    • 找到您关心的模型,比如说“用户”
    • User.connection.indexes("users").inspect
    • 利润

    【讨论】:

      猜你喜欢
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多