sábado, 5 de noviembre de 2011

ActiveRecord CallBacks

Cuando los modelos se empiezan a complicar es bastante útil conocer los distintos métodos que tenemos para interferir en los procesos de transferencia entre la base de datos y nuestros modelos, aquí viene un pequeño resumen:


Cargando objetos:

Nos permiten alterar los datos o intervenir en el proceso de carga en memoria.
  • after_initialize: cuando queremos interferir al crear / cargar (instanciar) un objeto.
  • after_find: cuando se carga en memoria un objeto de la base de datos (model.find, model.first..). 
Tener en cuenta que primero se lanza "after_find" y luego "after_initialize".

def after_initialize
    user.name = self.name.capitalize
end

user = User.new(:name => 'ADMIN') 
puts user.name 
=> Admin

Si queremos que algo solo se aplique a los modelos que provienen de la base de datos, debemos utilizar el "after_find" (para marcar que es un modelo con A.R.) y si queremos que se aplique a todo (creados en memoria y leídos de la base de datos), tenemos que utilizar el "after_initialize".


Guardando objetos (nuevos o existentes):

Están disponible al invocar save (user.save)
  • before_validation i [before_validation_on_create | before_validation_on_update]: típicamente para automatizar campos (calculados, assegurar-se que un valor no es nulo...).
  • after_validation, [after_validation_on_create | after_validation_on_update], before_save: típicamente para validar la lógica del modelo y de la aplicación en conjunto.
  • [arround_insert | arround_update]: guardado físico y validación por parte de la base de datos.
  • [after_create | after_update] y after_save: desencadenadores que nos permiten actualizar contadonres, actualitzar dependencias, comunicar acciones o eventos por correo o servicios web, etz..


Eliminando objetos (existentes en la base de datos):

Están disponibles al invocar destroy (user.destroy)
  • before_destroy: validar la lógica del modelo y de la aplicación en conjunto, por ejemplo dependencias.
  • arround_destroy: guardado físico y validación por parte de la base de datos.
  • after_destroy: desencadenadores que nos permiten actualizar contadonres, actualitzar dependencias, comunicar acciones o eventos por correo o servicios web, etz..


Guardado conjunto con transacciones:

Si tenemos una transaccion definida (ejemplo típico de transferir dinero de una cuenta a otra)

SendMoney.transaction do
    customer_1.save
    customer_2.save
end

Tenemos disponible:
  • after_commit: cuando la transacción y todos sus pasos se han realizado correctamente
  • after_rollback: cuando la transacción a fallado, porqué uno de los pasos a fallado.


Guardado con relaciones o anidado (relations and nested atributes):

Si tenemos modelos con relaciones definidas (has_many, belongs_to, ...) podemos aprovechar los métodos siguiente métodos para interferir en su creación:

  • before_add y after_add: al crear
  • before_remove y after_remove: al eliminar

class Customer < ActiveRecord::Base
    has_many :orders, :before_add => :check_credit_limit
    ...


Cuadro resumen:



Más información en:


No hay comentarios:

Publicar un comentario