rescue true

22 septiembre, 2010

Detectando cambios en los atributos: self.changes

Filed under: Proyectos,Ruby on Rails,Tips&Tricks — xurdekio @ 9:25 am
Tags: , ,

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

Dejar un comentario »

Aún no hay comentarios.

RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Crea un blog o un sitio web gratuitos con WordPress.com.

A %d blogueros les gusta esto: