2011-03-31 27 views
5

Tengo un siguiente modelo con rails3 MongoIdmongid incrustados devoluciones de llamada de documentos

class Address 
    include Mongoid::Document 
    embedded_in :person, :inverse_of => :address 
    after_validation :call_after_validation 
    before_validation :call_before_validation 
    before_update :call_before_update 
    after_update :call_after_update 
    after_create :call_after_create 
    before_create :call_before_create 

    field :address1 
    field :address2 

    private 
    def call_after_validation 
    puts "After validation callback fired." 
    end 

    def call_before_validation 
    puts "Before validation callback fired." 
    end 

    def call_before_update 
    puts "Before update callback fired." 
    end 

    def call_after_update 
    puts "After update callback fired." 
    end 

    def call_after_create 
    puts "After create callback fired." 
    end 

    def call_before_create 
    puts "Before create callback fired." 
    end 



end 

class Person 
    include Mongoid::Document 
    embeds_one :address 

    field :name 
end 

Ahora i utiliza la forma anidada para salvar a la persona y dirección a la vez.

Pero todo antes/después de crear devoluciones de llamada/actualización de dirección no están disparados excepto para después/before_validation

¿Alguna sugerencia para qué después/antes de crear/actualizar las devoluciones de llamada no están siendo despedidos por la dirección cuando se crean de la forma anidada?

Gracias

+0

Actualización: Estoy utilizando la versión 2.0.0 MongoId beta19 – Gagan

Respuesta

4

Mongoid sólo desencadena la devolución de llamada del documento que la acción persistencia fue ejecutado el.

Por lo tanto, en este caso, solo se activará la devolución de llamada de validación para Dirección porque la dirección está incrustada en Persona. La devolución de llamada de creación/actualización se llamará para Persona.

+0

¿Hay alguna forma o cortar por el cual embebido docs before_save/after_save devoluciones de llamada se activarán o se puede lograr una acción similar. – Gagan

+0

No lo creo, pero puede agregar un código al modelo de Persona para hacer lo que quiera, ¿sí? – BenB

25

Puede utilizar cascade_callbacks: verdad en el documento padre:

embeds_one: niño, cascade_callbacks: verdadera

+0

¡Gracias! Aunque a menudo esto no es necesario, en algunos casos es algo muy útil. – fifigyuri

+0

Gracias. Respuesta muy útil. –

Cuestiones relacionadas