2009-10-31 4 views
13

Para limpiar algunos datos incorrectos agregué una devolución de llamada antes de guardar. Ahora necesito forzar a todos los modelos para que se guarden de nuevo. Sin embargo ninguna operación de actualización pasa si hago estoCómo forzar un registro para que se guarde incluso si no he cambiado ninguno de los atributos

User.first.save 

¿Cómo fuerzo todos los modelos para llevar a cabo la operación de guardar a pesar de que no tengo ningún atributo cambiado.

+0

En realidad, en los carriles 3.3.17, llamar 'save' ahora * * hace llamar' devoluciones de llamada before_save', incluso si no se ha modificado. – you786

Respuesta

24

Debería poder usar touch, dispara devoluciones de llamada cuando se guarda.

Alternativamente apagar partial_updates: ActiveRecord::Base.partial_updates = false

+17

touch ya no parece ejecutar devoluciones de llamada, al menos en los rieles 3.03 los documentos dicen: "Guarda el registro con los atributos updated_at/on establecidos en la hora actual. Tenga en cuenta que no se realiza ninguna validación y no se ejecutan callbacks. se pasa un nombre de atributo, ese atributo se actualiza junto con los atributos updated_at/on ". –

+0

Al menos en Rails 4.2 ejecuta las devoluciones de llamada 'after_touch',' after_commit' y 'after_rollback':" Guarda el registro con los atributos updated_at/on establecidos en la hora actual. Tenga en cuenta que no se realiza ninguna validación y solo after_touch, after_commit y after_rollback devoluciones de llamada se ejecutan ". –

1

Si los atributos no son modificados que no va a salvar. Si modificó algo durante la limpieza, debería poder guardarse.

+0

limpieza ocurre durante la devolución de llamada. Y las devoluciones de llamada no se activan hasta que cambie los atributos que no estoy haciendo. – Roger

16

Como Josh Rickard comentó la respuesta aceptada, ya que Rails 3.0.X touch ya no invoca la validación y las devoluciones de llamada.

Sin embargo, puede "tocarlo" manualmente con model.update_attribute(:updated_at,Time.now) y omitir la validación e invocar rellamadas de esa manera.

2

Puede seguir utilizando toque para resolver su problema, como respuestade cwninja señala.

Cierto, ya no activa las devoluciones de llamada tradicionales en los últimos carriles, como se menciona en Josh Rickard. Pero activa la devolución de llamada after_touch.

véase la parte inferior de esta página:

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

+0

Confirmar __touch__ todavía funciona. Esta es la respuesta correcta. –

Cuestiones relacionadas