Hoy se nos planteaba el problema de enviar un e-mail a los usuarios inscritos a un evento cuando cuando las fechas cambiasen, para así mantenerlos informados.
Como siempre Ruby y Rails al rescate con el metodo changes, que nos devuelve un completo hash con los cambios en el objeto, y va más allá incluso devolviéndonos el cambio exacto, es decir, estado anterior y estado actual del valor.
evento = Evento.create(:titulo => "Prueba", :fecha_inicio => Date.today) #Creamos el evento con la fecha de hoy
evento.fecha_inicio = Date.tomorrow #Cambiamos la fecha..
evento.changes # Nos devuelve {"fecha_inicio" =>[Wed, 22 Sep 2010, Thu, 23 Sep 2010] }
Como veis, las keys del hash son los nombre de los atributos, y los values el array [valor_anterior, valor_actual].
En nuestro caso solo necesitábamos avisar a los usuarios si el evento estaba pendiente de fecha y ahora ya la tenía, así que aprovechando los callbacks nos queda algo así:
def after_save
#Si cambia la fecha de inicio (antes no la tenia y ahora si.. hay que mandar un mail a los inscritos)
if self.changes.has_key?("fecha_inicio") and self.changes["fecha_inicio"][0].nil?
self.inscripciones.all(:conditions => ["estado != ?",Inscripcion::ESTADO_CANCELADA]).each do |inscripcion|
InscripcionMailer.deliver_nueva_fecha(inscripcion)
end
end
end
No será un método desconocido para muchos de vosotros pero tampoco está de más recordar de vez en cuando su funcionamiento!
P.D.: Una vez que el objeto se ha salvado podeis recurrir al método previous_changes
