2011-03-12 24 views
5

Tengo modelos de grupo, membresía y usuario. Conectado con un has_many: a través de la asociación. En lo que respecta a la ruta, la membresía está anidada dentro del grupo.Devolución de llamada al método en el modelo diferente

Lo que deseo es que cada vez que alguien se una o abandone el grupo (es decir, cree o destruya membresía), inicie una comprobación en el grupo para verificar cuál es el idioma dominante (este es un atributo en el modelo de Usuario) y actualice el atributo de idioma en el modelo de Grupo.

Tengo un método llamado define_language en el modelo de grupo que parece funcionar de forma independiente.

ahora tengo que llamar a este método desde el modelo de afiliación, estaba pensando en hacer esto con una devolución de llamada after_save, pero estoy teniendo problemas para referencia al método en el modelo (diferente) Grupo.

Puse este método en el modelo de Grupo y no en el modelo de Membresía, ya que creo que semánticamente tiene poco que ver con la membresía. ¿Esta suposición es incorrecta? ¿Cómo abordaría este problema de manera eficiente?

Respuesta

2

Una forma es:

class Membership < ActiveRecord::Base 
    belongs_to :group 
    before_save :update_group_language 

    ... 

    private 

    def update_group_language 
    self.group.define_language 
    end 
end 

no puedo ver cómo esto podría funcionar sin embargo:

class Membership < ActiveRecord::Base 
    belongs_to :group 
    before_save group.define_language 
end 

El problema con eso es que belongs_to solo es evaluado por Ruby cuando se cargan los rieles por primera vez.

+0

¡Esta respuesta funcionó para mí! Gracias – SupremeA

1

lo he descubierto, que acaba de ejecutar en Membership.rb

before_save group.define_language 

Y tadaa! Llamará define_language en el modelo Group.rb.

opcional se puede añadir como para definir la relación:

before_save group.define_language "id = #{group_id}" 
+0

Esto no es correcto, arrojará el error "variable local indefinida o grupo de métodos" y no puede llamar a self.group en una devolución de llamada, por lo que debe ajustar la llamada dentro de un método, tal como se muestra en la respuesta de @ cmrichards – rmcsharry

Cuestiones relacionadas