Estoy enamorado de los observers. Son muy básicos, casi de 'primero de rails', pero la verdad es que evitan muchísimo trabajo y son ante todo muy DRY.
En rails el observer es una clase más de ActiveRecord. El concepto no es nada novedoso: es un trigger que actúa cuando el objeto al que vigilamos cambia, a modo de callback. Sus usos son variados, pero me quedo con dos muy típicos pero muy útiles.
Por ejemplo, enviar un correo informativo cuando el estado de una solicitud ha cambiado, sacado de la misma página de rails.
class SolicitudObserver < ActiveRecord::Observerdef after_save(solicitud)Notifications.deliver_status("admin@do.com", "Se ha cambiado el estado de la solicitud", status)endend
Y el que más me gusta: hacer el trabajo sucio una sola vez. Ampliando el ejemplo anterior, imaginemos que hay que desencadenar varios cambios cada vez que uno hace un cambio en esa solicitud, o simplemente que tenemos un modelo desnormalizado de datos que nos obliga a mantener una tabla cada vez que algo cambia (y además nos manda el mail :) ). Pues nada más fácil.
class SolicitudObserver < ActiveRecord::Observerdef after_save(solicitud)addons = SolicitudAddons.find(solicitud.id)addons.updated = Time.nowaddons.status = solicitud.statusaddons.otrapropiedad = loqueseaaddons.saveNotifications.deliver_status("admin@do.com", "Se ha cambiado el estado de la solicitud", status)endend
Así no tendremos que pensar que en cada acción que modifique el modelo de solicitudes hay que cambiar datos en otras tablas.
Se que es una chorradilla, pero me parece fascinante poder desencadenar esas cascadas solo con un pequeño cambio :)














