Forum: Rails-ES Observer y estado anterior del objeto

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
David A. (Guest)
on 2007-02-26 17:21
(Received via mailing list)
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
Fernando B. (Guest)
on 2007-02-27 09:07
(Received via mailing list)
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.
David A. (Guest)
on 2007-02-27 10:45
(Received via mailing list)
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 :-(

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 :-)

--
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
Fernando B. (Guest)
on 2007-02-27 12:58
(Received via mailing list)
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.
David A. (Guest)
on 2007-02-27 13:23
(Received via mailing list)
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 :-)
--
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
This topic is locked and can not be replied to.