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

Diego Algorta Casamayou
Tue Feb 14 18:55:28 GMT 2006


No tengo demasiada experiencia todavía, pero creo que podrías usar un 
filtro before_save().

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

En el método que definar para ejecutar before_save, recorrés los 
contacts de ese contact y te asegurás de que el mismo también esté en 
los contacts de los demás.

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.

Saludos,
Diego

Sergio Gil Pérez de la Manga escribió:
> Ole los títulos raros ;)
> 
> A ver, cuento lo que quiero hacer, lo que he conseguido, y a ver si a 
> alguien se le ocurre cómo puedo completar la tarea.
> 
> Tengo un modelo llamado Contact, que almacena contactos, y me gustaría 
> poder relacionarlos unos con otros. Leyendo un poco por ahí [1], llego a 
> lo siguiente:
> 
> - Creo una tabla llamada contacts_contacts, con una columna llamada 
> contact_id, y otra, por ejemplo, related_id.
> - En el modelo Contact:
> 
> has_and_belongs_to_many :contacts, :foreign_key => "related_id"
> 
> De esta forma se puede añadir un contacto como relacionado a otro, por 
> ejemplo:
> 
> un_contacto=Contact.find(1)
> otro_contacto=Contact.find(2)
> un_contacto.contacts << otro_contacto
> un_contacto.contacts[0].name      # "El nombre de 'otro_contacto'"
> 
> Perfecto.
> 
> Sin embargo, la relación que pretendo modelizar no es padre-hijo, sino 
> de igual a igual, de modo que sin hacer nada más, la relación quedara 
> almacenada en ambos contactos, de manera que también pudiera hacer:
> 
> otro_contacto.contacts[0].name      # "El nombre de 'un_contacto'"
> 
> Cosa que ahora mismo no sucede. ¿Se os ocurre alguna forma de hacerlo? 
> Gracias :)
> 
> -- 
> Sergio Gil Pérez de la Manga >
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Ror-es mailing list
> 
>