¿Hay alguna forma de saltear devoluciones de llamada y validación haciendo algo similar en Rails 3?Saltarse las devoluciones de llamada y validación
Object.save(:validate => false, :skip_callbacks => true)
Gracias!
¿Hay alguna forma de saltear devoluciones de llamada y validación haciendo algo similar en Rails 3?Saltarse las devoluciones de llamada y validación
Object.save(:validate => false, :skip_callbacks => true)
Gracias!
me encontré con algo así antes y lo utilizaron este:
Model.send(:create_without_callbacks)
Model.send(:update_without_callbacks)
http://guides.rubyonrails.org/active_record_validations_callbacks.html detalla una pequeña lista de métodos que evitan devoluciones de llamada y validaciones; ninguno de estos incluye 'guardar' sin embargo.
Sin embargo, el punto de las validaciones y las devoluciones de llamadas es hacer cumplir la lógica comercial. Si los estás evitando, deberías preguntarte por qué.
Consulte también: How can I avoid running ActiveRecord callbacks?
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).
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
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í:
Fuente: Skipping Callbacks
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.
+1 con muchas gracias ... – ecoologic
No funciona en Rails 4. –