2009-10-31 8 views
13

Per eliminare alcuni dati errati ho aggiunto un callback prima di salvare. Ora ho bisogno di forzare tutti i modelli per essere nuovamente salvati. Tuttavia nessuna operazione di aggiornamento succede se faccio questoCome forzare un record per salvarsi anche se non ho modificato alcun attributo

User.first.save 

Come forzo tutti i modelli per eseguire operazione di salvataggio, anche se non ho alcun attributo modificati.

+0

In realtà, in Rails 3.3.17, chiamando 'save' ora * * fa chiamare' callback before_save', anche se nulla è stato modificato. – you786

risposta

24

Dovresti essere in grado di utilizzare touch, esso attiva le richiamate quando viene salvato.

alternativa spegnere partial_updates: ActiveRecord::Base.partial_updates = false

+17

touch non sembra più eseguire callback, almeno nei binari 3.03 i documenti dicono: "Salva il record con gli attributi updated_at/on impostati sull'ora corrente." Si noti che non viene eseguita alcuna convalida e non vengono eseguiti callback. viene passato un nome di attributo, quell'attributo viene aggiornato insieme agli attributi updated_at/on. " –

+0

Almeno in Rails 4.2 esegue i callback 'after_touch',' after_commit' e 'after_rollback':" Salva il record con gli attributi updated_at/on impostati sull'ora corrente. Si noti che non viene eseguita alcuna validazione e solo after_touch, after_commit e callback after_rollback vengono eseguiti. " –

1

Se gli attributi non vengono modificati non salverà. Se hai modificato qualcosa durante la pulizia, dovrebbe poter essere salvato.

+0

pulizia si verifica durante la richiamata. E i callback non vengono sparati finché non cambio gli attributi che non sto facendo. – Roger

16

Come Josh Rickard ha commentato la risposta accettata, poiché Rails 3.0.X touch non richiama più la convalida e le callback.

È possibile, tuttavia, "toccarlo" manualmente con model.update_attribute(:updated_at,Time.now) e saltare la convalida e richiamare le richiamate in questo modo.

2

È comunque possibile utilizzare tocco per risolvere il problema, come risposta di cwninja sottolinea.

È vero, non attiva più i tradizionali callback negli ultimi Rails, come indicato da Josh Rickard. Ma attiva la callback after_touch.

vedere in fondo a questa pagina:

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

+0

La conferma di __touch__ funziona ancora. Questa è la risposta corretta. –

Problemi correlati