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
def after_initialize
user.name = self.name.capitalize
end
user = User.new(:name => 'ADMIN')
puts user.name
=> AdminSi 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
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:
- A Guide to Active Record Associations -> 4.5 Association Callbacks
- Active Record Validations and Callbacks -> 9 Callbacks Overview
No hay comentarios:
Publicar un comentario