2012-07-17 11 views
25

He estado revisando la fuente de los carriles desde hace un tiempo, y no creo que haya una mejor forma de obtener la lista de todas las devoluciones que no sean: ActiveRecord::Callbacks::CALLBACKS - que es una lista constante.Lista de devoluciones de llamadas de ActiveRecord

Es decir, si usted está utilizando una joya como devise_invitable que añade una nueva llamada de devolución de llamada :invitation_accepted con la puntuación :after y luego :beforeActiveRecord::Callbacks::CALLBACKS no va a funcionar.

¿Conoces una solución fácil, aparte de abrir módulos de rieles y asegurarte de que haya una lista interna de call-backs por clase de modelo?

Respuesta

37

Puede llamar al Model._save_callbacks para obtener una lista de todas las devoluciones de llamada al guardar. Luego puede filtrarlo hasta qué tipo necesita, p. :before o :after así:

Model._save_callbacks.select {|cb| cb.kind == :before} 

funciona igual para Model._destroy_callbacks etc.

+2

también puedes ver la documentación para información más detallada: http://apidock.com/rails/ActiveRecord/Callbacks –

3

Tenga en cuenta que si simplemente desea activar devoluciones de llamada, puede utilizar el método de #run_callbacks(kind):

o = Order.find 123 # Created with SQL 
o.run_callbacks(:create) 
o.run_callbacks(:save) 
o.run_callbacks(:commit) 
17

El docs diga "Hay diecinueve devoluciones de llamada en total" ... ¡pero no parecen decir lo que realmente son esos 19!

Para aquellos que Googled "lista de todas las devoluciones de llamada ActiveRecord" como lo hice, aquí está la lista (que se encuentra mediante el uso de ActiveRecord::Callbacks::CALLBACKS como se describe en la pregunta):

:after_initialize 
:after_find 
:after_touch 
:before_validation 
:after_validation 
:before_save 
:around_save 
:after_save 
:before_create 
:around_create 
:after_create 
:before_update 
:around_update 
:after_update 
:before_destroy 
:around_destroy 
:after_destroy 
:after_commit 
:after_rollback 
+0

Ah, y me acaba de descubrir que están listados [aquí] (http://edgeguides.rubyonrails.org/ active_record_callbacks.html), en las guías. Aún así, espero que esta respuesta le ahorre a alguien tiempo de Google en el futuro. – GMA

2

Si está trabajando en una versión de Rails antes del método ._save_callbacks, puede utilizar el siguiente:

# list of callback_chain methods that return a CallbackChain 
Model.methods.select { |m| m.to_s.include? "callback" }.sort 

# get all methods in specific call back chain, like after_save 
Model.after_save_callback_chain.collect(&:method) 
Cuestiones relacionadas