【发布时间】: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