¿Cómo puedo saber cuándo "actualizar" mi objeto modelo en Rails?


Aquí está parte de una prueba de integración que estoy teniendo:

user = User.first
assert !user.is_active?

get confirm_email_user_url(user),:confirmId => user.mail_confirmation_hash

assert_equal response.status,200
# because confirm_email_user_url modifies the activation state of the object
user = User.first
assert_equal user.state,"activated"

Pasé la última hora depurando esto :). En mi versión inicial, no estaba reinicializando user después de que se accediera a confirm_email_user_url, y el estado siempre era inactive a pesar de que el usuario estaba activado.

¿Cómo sé si debo "recargar" ( a falta de un nombre mejor ) mi objeto modelo? ¿A qué debo llamar para hacerlo?

Author: Geo, 2011-04-02

2 answers

Tendrías que llamar user.reload siempre que los datos hayan cambiado en la base de datos.

En el código anterior, el objeto "user" se crea en memoria a partir de los datos obtenidos de la base de datos por User.first. Entonces, parece que su confirm_email_user_urlmodifica la base de datos . El objeto no sabe de esto hasta que reload él, que vuelve a adquirir los datos de la base de datos.

No estoy seguro de si hay una forma programática de saber cuándo necesitará recargar el objeto, pero como un desarrollador usted debe ser consciente de lo que está pasando y manejar adecuadamente. En la mayoría de mi experiencia (que es algo limitada), esto es solo un problema durante las pruebas. En producción, no es típico que un objeto se modifique en la base de datos mientras se carga en la memoria. Lo que normalmente sucede es que el objeto en memoria se modifica y luego se guarda en la base de datos (es decir, user.email = "[email protected]" seguido de user.save). Supongo que si tuvieras una aplicación de alta actividad donde muchos usuarios podrían estar modificando algo en breve sucesión, querrías tener cuidado al respecto.

 116
Author: dantswain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-17 18:56:02

Por cierto. esto realmente no funciona cuando haces cosas en el modelo en sí como Report.count. Después de interminables intentos de restablecer la información de la columna o obtener una instancia del primer/último registro y recargarlo, lo único que me ayudó fue volver a conectar la base de datos entre los recuentos de esta manera:

initial_count = Report.count

# do something, like invoking a rake task that imports the reports, ..

Report.connection.reconnect!
final_count = Report.count

Esto funcionó para Rails 2.3.8+, no conozco las versiones 3+.

 6
Author: Thomas Fankhauser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-19 12:35:00