[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