Come saltare i callback di ActiveRecord?

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.