Observer y estado anterior del objeto


#1

Hola,

Estoy utilizando observers para realizar tareas que se repiten en los
procesos de
actualización.
Mi problemilla es que a veces tengo que hacer comparaciones con el
estado anterior del objeto, para lo cual siempre termino haciendo una
consulta para comparar con el estado actual:

class FooObserver < ActiveRecord::Observer

def before_update(foo)
new_email = foo.email
# aquí tengo que hacer una consulta extra
# para cargar el estado anterior del objeto
old_email = Foo.find(foo.id).email
unless old_email == new_email

¿No hay una forma de acceder al estado anterior del objeto sin
necesidad de hacer esa query extra?

Gracias

David A., el único desarrollador con una orden de alejamiento de
Jeffrey Zeldman
Simplelogica.net, ahora con un 33,3% más de intromisión en listas de correo

Cuando no hago otra cosa escribo en mildiez.net


#2

Aunque sea un poco más sucio y menos elegante, puedes hacero en el
controlador, antes de hacer el update (supongo que sólo lo
modificarásen el método update del controlador), porque ahí tienes el objeto en
el estador anterior y el params[:email] con el nuevo email.

Aunque claro, si ese modelo lo modificas ya en más de un lugar, has de
repetir código en muchos controladores, con lo cuál queda más elegante
el modelo, aunque realices una query extra.


#3

On 2/27/07, Fernando B. removed_email_address@domain.invalid wrote:

Aunque sea un poco más sucio y menos elegante, puedes hacero en el
controlador, antes de hacer el update (supongo que sólo lo modificarás
en el método update del controlador), porque ahí tienes el objeto en
el estador anterior y el params[:email] con el nuevo email.

Ok, pensaba que lo mismo estaba cargado en memoria el estado anterior
del objeto :frowning:

Lo estoy haciendo con observers porque son tareas que deberían ocurrir
siempre que se modifiquen determinados valores del objeto, aunque
quizá me estoy colando, lo revisaré. Daría para un post muy
interesante el tema de cuándo utilizar observers y
ventajas/inconvenientes (y no me estoy refiriendo a nadie :-D)

Muchas gracias :slight_smile:


David A., el único desarrollador con una orden de alejamiento de
Jeffrey Zeldman
Simplelogica.net, ahora con un 33,3% más de intromisión en listas de correo

Cuando no hago otra cosa escribo en mildiez.net


#4

De todas formas nosotros tenemos en los observers algún que otro find,
porque la elegancia pesa, y creemos que es preferible a liarnos con
introducir lógica propia de los modelos en los controladores.

Así que yo de ti lo dejaría como habías puesto, pero optimizando un
poquitín el find

class FooObserver < ActiveRecord::Observer

def before_update(foo)

old_email = Foo.find(foo.id, :select => “id, email”).email

end

Que aunque parezca que no, esas optimizaciones tan tontas del find se
notan y mucho.


#5

On 2/27/07, Fernando B. removed_email_address@domain.invalid wrote:

class FooObserver < ActiveRecord::Observer

def before_update(foo)

old_email = Foo.find(foo.id, :select => “id, email”).email

end
Que aunque parezca que no, esas optimizaciones tan tontas del find se
notan y mucho.

Me apunto la modificación, si tengo tiempo revisaré también porque
supongo que tengo bastantes select * que se pueden optimizar mucho.

Gracias de nuevo :slight_smile:

David A., el único desarrollador con una orden de alejamiento de
Jeffrey Zeldman
Simplelogica.net, ahora con un 33,3% más de intromisión en listas de correo

Cuando no hago otra cosa escribo en mildiez.net