Bienvenido(a) a Proyecto Script

Hola!!!

Este es un buen lugar donde buscar las respuestas a tus dudas sobre "Programación", "Lenguajes", "Linux", "Electrónica", etc.

Suele ser difícil buscar en la red y encontrar respuestas claras y en español a muchas preguntas sobre estos temas, así que aquí tienes un buen lugar para iniciar.

Quieres ser parte de esto, solo ¡regístrate!

lunes, 8 de diciembre de 2008

Tabla simulando un arbol

Seguramente se ha presentado el caso donde tiene una tabla a nivel base de datos que guarda la información de una entidad que tiene un comportamiento de árbol, peensando un ejemplo práctico tenemos una tabla de Categorias la cual esta construida por el siguiente script:

   1 CREATE TABLE categories (
   2   id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   3   nombre VARCHAR(20) NOT NULL,
   4   parent_id BIGINT NULL
   5 );


De esta manera podriamos tener lo siguiente:

  • General de División
    • General de Brigada
      • General Brigadrier


Y visto como una tabla tendrías:

id |        nombre       | parent_id
------------------------------------
 1 | General de División |   null
 2 | General de Brigada  |     1
 3 | General Brigadier   |     2


Vayamos al código...
Existe una funcion llamada "acts_as_tree" la cual nos ayuda con ese comportamiento, es importante hacer la aclaración que hasta la versión 1.x de Rails (mas específicamente en ActiveRecord) era parte de ésta, pero apartir de la versión 2.x, ésta fue seprada para convertirse en un plugin.

La instalación del plugin es muy sencilla, basta con ejecutar la siguiente linea:

script/plugin install acts_as_tree


Una vez hecho esto, podemos ir a nuestra clase model "Categoria":

   1 class Categoria < ActiveRecord::Base
   2   acts_as_tree :order => 'parent_id'
   3 end


De esta manera tenemos los isguientes metodos disponibles para aprovechar mucho mejor el comportamiento en arbol:

MétodoDescripcion
childrendevuelve todos los hijos inmediatos
parentdevuelve el padre (objeto inmediato)
siblingsdevuelve todos los hijos del mismo padre (hermanos)
self_and_siblingsdevuelve todos los hermanos incluyéndome
ancestorsdevuelve todos los objetos padre hasta llegar a la raiz (padre, abuelo, etc)
rootdevuelve el objeto raiz de la jerarquía


Digg!

1 comentario:

alfredo dijo...

Muy buen ejemplo, simple pero completo. Gracias