Quiero agregar un índice a una base de datos de producción. Afortunadamente, estamos ejecutando Postgres, lo que permite una indexación simultánea, por lo que podemos agregar un índice sin tiempo de inactividad. Los índices concurrentes de captura no se pueden agregar desde una transacción, y las migraciones de rieles envuelven todo dentro de una transacción.¿Cómo detener la migración de Rails 3.1 para que no se ejecute en una transacción?
Afortunadamente, hay algo que parece una solución realmente simple: sobrescribir el método privado ddl_transaction de ActiveRecord :: Migration, como explained here.
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
El problema es que no parece funcionar en Rails 3.1. Hago exactamente lo que hace el código en Gist, y los rieles parecen ignorarlo por completo. ¿Alguna idea de dónde ir con esto?
¿Ha intentado cambiar la definición del método de manera que se trata de un método de la clase? p.ej. 'def self.ddl_transaction (& block) ...' –