我想在生产数据库中添加索引。幸运的是,我们正在使用Postgres,它可以很好地支持并发索引,因此我们可以在不停机的情况下添加索引。但有一个问题-- 并发索引不能在事务内添加,而Rails迁移将所有内容都包装在事务中。
幸运的是,有一个看起来非常简单的解决方案:覆盖ActiveRecord :: Migration私有方法ddl_transaction,如这里所述。
class IndexUsersEmails < ActiveRecord::Migration
def ddl_transaction(&block)
block.call # do not start a transaction
end
def self.up
execute "CREATE INDEX CONCURRENTLY index_users_on_email ON users(email)"
end
end
问题在于它似乎无法在Rails 3.1中工作。我完全按照Gist中的代码操作,但Rails好像完全忽略了它。有什么想法吗?
def self.ddl_transaction(&block) ...
- Derek Harmel