ActsAsTree lo que hace es crear una tabla en donde guarda el nombre de la clase, la primary key y el parent_id de cada instancia de cada modelo que nos interese que se comporte como árbol. Con esta tabla puede dar soporte a todos los modelos ActiveRecord que tengas definidos, además en cada modelo vas a tener acceso a estos métodos:
children() – all immediate children of current object
parent() – first ancestor of the current object
siblings() – all children of my parent excluding me
self_and_siblings() all children of my parent including me
ancestors() all parent, grandparent, etc… object up to root
root() the base object we descended from in the tree
children() – all immediate children of current object
parent() – first ancestor of the current object
siblings() – all children of my parent excluding me
self_and_siblings() all children of my parent including me
ancestors() all parent, grandparent, etc… object up to root
root() the base object we descended from in the tree
Otra forma de hacer casi lo mismo pero sin un plugin y sin guardar las relaciones entre nodos en una tabla externa es la siguiente:
Suponiendo que tenemos el modelo "Box", lo que vamos a hacer es crear una estructura que permita guardar cajas dentro de cajas. Sólo vamos a guardar la relación de cada nodo con su padre.
primero hay que agregar el campo "parent_id" en la tabla "boxes":
class BoxAddReferenceToParent <>
class Box < ActiveRecord::Base
class Box < ActiveRecord::Base
class BoxAddReferenceToParent <>
def self.up
add_column :boxes,
:parent_id,
:integer
end
def self.down
remove_column :boxes,
:parent_id
end
end
segundo, agregamos la relación en el modelo de cada nodo con su parent (en este caso el parent es la caja que contiene a cada instancia):
class Box < ActiveRecord::Base
belongs_to :parent,
:class_name => "Box",
:foreign_key => "parent_id"
end
tercero y último, agregamos la relación de cada caja con las que están dentro de ellas:
class Box < ActiveRecord::Base
belongs_to :parent,
:class_name => "Box",
:foreign_key => "parent_id"
has_many :children,
:class_name => "Box",
:foreign_key => "parent_id"
end
listo!
Desde la consola de rails podés crear un par de cajas y probar algo como esto:
b = Box.find 17
b.parent # es la caja que contiene a b
b.children # es un Array de los objetos Box que están dentro de b
Esta solución no es tan automágica como ActsAsTree pero me parece mucho mas prolija, las relaciones entre los nodos están donde deben estar.
No hay comentarios.:
Publicar un comentario