2010-02-08 7 views
6

¿Alguien ha implementado un gancho after_commit en Rails? Yo no busco modelo basado después de la cometa a actualizar/crear/etc, quiero ser capaz de definir dinámicamente un bloque que se ejecuta sólo si la transacción actual (de más arriba) pasa:Rails after_commit?

def remove_file 
    current_transaction.after_commit do 
    FileUtils.rm(file_path) 
    end 
end 

Cualquier idea si esto ya se ha implementado, si va a estar en los rieles 3.0?

+0

¿No puede hacer un after_save y comprobar si el objeto se ha actualizado? – marcgg

+0

Esto funcionaría si su transacción solo incluye la operación de guardado de un solo modelo. Necesito envolver al menos 'Node + Version + Attachment' ... – gaspard

Respuesta

2

No verá after_commit en Rails 3.0, al menos no todavía. Puedes aplicar un parche y ver si es aprobado por el equipo central, pero dudo que lo haga. Esta funcionalidad sigue siendo mucho más funcional fuera del núcleo de Rails, en un complemento.

Puede probar este plugin:

http://github.com/GUI/after_commit

+0

Miré el plugin, pero es una forma estática de definirlo después de los commits, y están enganchados en un solo modelo por lo que vi. Preferiría algo que agregas a las devoluciones de llamada 'after_commit' mientras guardas. – gaspard

1

He creado un plugin after_commit ligera: after_commit plugin que permite la siguiente sintaxis:

def some_callback 
    after_commit do 
    # save file, expire cache, etc 
    end 
end 

Es muy ligero, pero hace el trabajo.

1

Como OP ha preguntado sobre la configuración dinámica del código que se ejecutará después de que se haya comprometido una transacción, after_commit no resuelve su problema. Afortunadamente hay una gema after_commit_queue que resuelve exactamente este problema.

Usando el ejemplo de OP, el código se vería así:

include AfterCommitQueue 

def remove_file 
    run_after_commit do 
    FileUtils.rm(file_path) 
    end 
end