2010-06-15 11 views

Respuesta

28

¡Sí, puedes!

Mongoid está basado en ActiveModel y ActiveModel tiene un skip_callback function. Puede utilizar skip_callback así:

# skip the callback 
MyModelClass.skip_callback(:save, :before, :ensure_foo_is_not_bar) 

my_model_instance.update_attributes :foo => 'bar' 

# restore the callback for future calls 
MyModelClass.set_callback(:save, :before, :ensure_foo_is_not_bar) 

estoy usando este sin problemas en una gran aplicación. Para obtener más información, consulte esta entrada del blog de Jeff Kreeftmeijer:

http://jeffkreeftmeijer.com/2010/disabling-activemodel-callbacks/

+0

Ah Cool, gracias! – jpemberthy

+0

Sería fantástico si hubiera una forma de desactivar todas las devoluciones de llamada, como por ejemplo, desactivar las validaciones: 'u.save! (Validate: false)' sería 'u.save! (Callbacks: false)' –

+0

Muchas gracias , este trabajo para saltar devoluciones de llamada en mi suite de pruebas. –

1

Busco el código. Y no hay forma de evitar la devolución de llamada en Mongoid. En ambas versiones 1.9 y 2.0.

Necesita hacer un parche o una solicitud de función al respecto.

+0

Gracias, sí. También estaba revisando la versión 2.0.0.beta y no hay soporte de omisión de devoluciones de llamada ... veamos cómo lo hace AR y luego impleméntelo en mi versión de mongoid. – jpemberthy

14

Podría ser más fácil de utilizar las operaciones MongoId atómicos (conectado, desconectado, etc.):

http://mongoid.org/en/mongoid/docs/persistence.html#atomic

Estos hacen no llamadas de devolución de incendios.

Editar: Mongoid 3 dice que no lanzan devoluciones de llamada. Sin embargo, estoy viendo devoluciones de fuego en Mongoid 2. Así que YMMV

+0

Esto también funciona en Mongoid 4. Me estaba costando muchísimo tratar de descubrir cómo incluir un contador en el documento principal con devoluciones de llamada en cascada establecidas en verdadero. – Dex

3

A menudo esto aparece cuando desea hacer una actualización sin activar todas las devoluciones de llamada en un gran volumen de elementos. Esto se puede hacer descendiendo al controlador:

Reemplazando 'foo' por 'bar' en el campo 'x'.

User.all.each do |u| 
    User.collection.where({ _id: u.id }).update({ 
    "$set" => { :x => u.x.gsub('foo', 'bar') 
    }) 
end 
7

Terminé usando la sugerencia de Brian Armstrong y simplemente llamando

person.set(name:"Robert Pulson") 

en mi devolución de llamada después de guardar.

+0

gracias hombre, funciona perfecto +1 – rusllonrails

Cuestiones relacionadas