Relacion 1 a n con ella misma


#1

Hola, alguien ha implementado una relación de una tabla consigo misma?
como se comporta o lo trata rails en este tipo de relaciones?

La razón de esta relación es la siguiente, en una tabla usuarios, hay
usuarios que son responsables de otros usuarios por eso la idea de poner
la clave foranea dentro de la misma tabla (uno a muchos con ella misma),
quedando algo así:

  • usuarios
    . id
    . usuario_id
    . nombre

seria suficiente con poner un has_many :usuarios dentro del modelo
usuario? o al ser una relación un tanto peculiar hay que indicarle a
Rails otra forma de tratarla?

Gracias por la ayuda que puedan facilitarme.
Un saludo.
Aitor

PD. si este tipo de relaciones es mejor evitarlas, cualquier otra idea
es bienvenida. gracias de nuevo.


#2

Hola,

La razón de esta relación es la siguiente, en una tabla usuarios, hay
usuarios que son responsables de otros usuarios por eso la idea de poner la clave foranea dentro de la misma tabla (uno a muchos con ella
seria suficiente con poner un has_many :usuarios dentro del modelo
usuario? o al ser una relación un tanto peculiar hay que indicarle a
Rails otra forma de tratarla?

Funciona bien con un has_many y un belongs_to en el modelo. Pero por el
mismo precio le pones un acts_as_tree y tienes algo de funcionalidad
adicional, como por ejemplo recorrer el árbol hacia arriba, hacia abajo
y en horizontal.

Si necesitas recorrer las ramas del árbol en varios niveles acts_as_tree
no es tu mejor opción porque hace una query por nivel (puedes usar eager
loading para un par de niveles, pero si tienes muchos no es una opción),
siempre puedes tirar de acts_as_nested_set, que penaliza los
inserts/updates/deletes pero está optimizado para consultas.

PD. si este tipo de relaciones es mejor evitarlas, cualquier otra idea
es bienvenida. gracias de nuevo.

No hay motivo para evitar estas relaciones. Son muy normales en
cualquier aplicación.

Saludos,

javier ramirez


#3

Muchas gracias Javier por indicarme las posibles soluciones para empezar
a buscar e informarme.

Un saludo.
Aitor