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

Diego Algorta Casamayou
Wed Feb 15 13:29:36 GMT 2006


Diego Algorta Casamayou escribió:
> 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)

Perdón... esto debería ser: super(contact)

>     # 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
> 
> _______________________________________________
> Ror-es mailing list
> 
> 
>