2011-06-30 15 views

Respuesta

5

me encontré con algo así antes y lo utilizaron este:

Model.send(:create_without_callbacks) 
Model.send(:update_without_callbacks) 
+0

+1 con muchas gracias ... – ecoologic

+1

No funciona en Rails 4. –

15
Object.save(:validate => false) 

obras como era de esperar. Por lo que sé, no puede desactivar las devoluciones de llamada (a menos que devuelva falso de una devolución de llamada before_ pero eso aborta la transacción).

3

Saltar devoluciones de llamada es un poco complicado. Algunos complementos y complementos agregan sus propias devoluciones de llamada "esenciales" (act_as_nested_set, oracle_enhanced_adapter como ejemplos).

Puede usar los métodos skip_callback y set_callback para verificar cuáles podría omitir.

Algunos métodos de clases personalizadas podrían ayudar:

def skip_all_callbacks(klass) 
    [:validation, :save, :create, :commit].each do |name| 
     klass.send("_#{name}_callbacks").each do |_callback| 
     # HACK - the oracle_enhanced_adapter write LOBs through an after_save callback (:enhanced_write_lobs) 
     if (_callback.filter != :enhanced_write_lobs) 
      klass.skip_callback(name, _callback.kind, _callback.filter) 
     end 
     end 
    end 
    end 



    def set_all_callbacks(klass) 
    [:validation, :save, :create, :commit].each do |name| 
     klass.send("_#{name}_callbacks").each do |_callback| 
     # HACK - the oracle_enhanced_adapter write LOBs through an after_save callback (:enhanced_write_lobs) 
     if (_callback.filter != :enhanced_write_lobs) 
      klass.set_callback(name, _callback.kind, _callback.filter) 
     end 
     end 
    end 
    end 
1

Para saltarse las devoluciones de llamada en Rails 3, puede utilizar update_all para su dada propósito.

Fuente: update_all

La lista completa de saltarse las devoluciones de llamada está aquí:

  • DECREMENT
  • decrement_counter
  • eliminar
  • delete_all
  • find_by_sql
  • inc Re-Ment
  • increment_counter
  • de palanca
  • toque
  • update_column
  • update_all
  • update_counters

Fuente: Skipping Callbacks

1

Si usted está tratando de actualizar el registro saltar todas las devoluciones de llamada y validaciones que c Debería usar update_columns pasando los atributos hash. Este método actualizará las columnas directamente en la base de datos.

Por ejemplo:

object.update_columns(name: 'William')

Si desea crear un nuevo objeto, por desgracia creo que no hay un método para saltarse ambas validaciones y devoluciones de llamada. save(:validate => false) funciona para validaciones. Para las devoluciones de llamada, puede usar skip_callback, pero tenga cuidado, su código probablemente no será seguro para subprocesos.

Cuestiones relacionadas