[Ror-es] Auto-relación simétrica

Diego Algorta Casamayou
Wed Feb 15 13:16:51 GMT 2006


Sergio Gil Pérez de la Manga escribió:
> El día 14/02/06, Diego Algorta Casamayou
> > escribió:
> 
>     Otra forma sería redefinir el método << y ahí mismo, cada vez que le
>     agregan un contacto B al contacto A, este mismo se agrega al con tacto
>     B. Cuidado porque podés quedar en loop. Para evitarlo, antes de que A
>     intente agregarse en los contactos de B, fijate si ya está agregado.
> 
> 
> ¡Qué buena idea! Un PHPero no se acostumbra a que en Ruby los operadores 
> son simplemente métodos que se pueden redefinir :)
> 
> Bueno, pues manos a la obra, a ver si soy capaz....

No lo probé... pero creo que esto funcionaría y sería MUCHO más 
performante que el uso del filtro before_save pues no necesita recorrer 
todos los contactos sino sólo los afectados:

class Contact < ActiveRecord::Base
   def <<(contact)
     # Agrego el contacto igual que hasta ahora utilizando
     # el << tradicional.
     super(v)
     # Ahora me fijo si el contacto ya me tiene entre sus contactos.
     if !contact.contacts.include?(self)
       contact.contacts << self
       contact.save
     end
   end
end

Saludos,
Diego