Possibile duplicato:
Come posso evitare di eseguire i callback di ActiveRecord?
Ho una modella come questa
class Vote < ActiveRecord::Base after_save :add_points_to_user ..... end
È ansible forzare in qualche modo il modello a saltare la chiamata di add_points_to_user
quando viene salvato? Forse qualcosa come ActiveRecord#delete
vs ActiveRecord#destroy
?
Per Rails 2, ma non Rails 3 puoi usare questi:
object.send(:create_without_callbacks) object.send(:update_without_callbacks)
Per Rails 3, ActiveSupport :: Callbacks offre il controllo necessario. Stavo affrontando la stessa sfida in uno scenario di integrazione dei dati in cui i callback normalmente desiderabili dovevano essere ignorati. È ansible reimpostare en_mallbacks in massa o utilizzare skip_callback per disabilitare con giudizio, come questo:
Vote.skip_callback(:save, :after, :add_points_to_user)
..dopo il quale è ansible operare su istanze di voto con: add_points_to_user inibito
Quanto segue si applica alle rotaie 2, alle rotaie 3 e alle rotaie 4:
http://guides.rubyonrails.org/v3.2.13/active_record_validations_callbacks.html#skipping-callbacks
Fornisce un elenco di metodi che ignorano i callback, spiegando perché è pericoloso utilizzarli senza un’attenta considerazione. Ristampato qui sotto le disposizioni della licenza Creative Commons Attribution-Share Alike 3.0.
12 Salto di callback
Proprio come con le convalide, è anche ansible saltare i callback. Questi metodi devono essere utilizzati con caucanvas, tuttavia, poiché le regole di business e la logica dell’applicazione possono essere mantenute in callback. Bypassandoli senza comprendere le potenziali implicazioni può portare a dati non validi.
- diminuzione
- decrement_counter
- Elimina
- cancella tutto
- find_by_sql
- incremento
- increment_counter
- ginocchiera
- toccare
- update_column
- aggiorna tutto
- update_counters
Questo salterà le tue convalide:
vote.save(:validate => false)
maggiori informazioni qui
Per saltare i callback e le convalide, è ansible utilizzare, update_column v (3.1) o update_all
vote = Vote.first vote.update_column(:subject, 'CallBacks')
Aparently questo funziona solo con ActiveRecord 3.1
O:
Vote.where('id = ?', YourID).update_all(:subject => 'CallBacks')
Alla fine hai anche io finalmente l’opzione e questo salterà tutto:
execute "UPDATE votes SET subject = 'CallBacks' WHERE id = YourID"
OK l’ultimo non è così carino.