Tengo modelado en una tabla un árbol, estos son los datos de la tabla:
Nombre de la tabla: Categories
Atributos:
id --> Integer (Clave primaria)
nombre --> String
parent_id --> Integer (Clave extranjera -> hace referencia al campo
clave de esta misma tabla)
Primera duda: ¿Deberia poner en el modelo Category ‘has_many
:categories,
:class_name => “Category”, :foreign_key => “parent_id”’ y ‘belongs_to
:category’? ¿o con poner ‘act_as_tree :order => “nombre”’ me lo puedo
ahorrar?
Segunda duda: ¿Como puedo hacer para obtener ÚNICAMENTE las hojas del
árbol
(es decir todos las nombres de las categorÃas que no tengan hijos?
On 8/14/07, Paco García [email protected] wrote:
:class_name => “Category”, :foreign_key => “parent_id”’ y ‘belongs_to
:category’? ¿o con poner ‘act_as_tree :order => “nombre”’ me lo puedo
ahorrar?
Con acts_as_tree vas bien, seria lo breve a lo anterior como dijo
Sebastian.
Segunda duda: ¿Como puedo hacer para obtener ÚNICAMENTE las hojas del árbol
(es decir todos las nombres de las categorías que no tengan hijos?
Podrias hacer:
Category.find(:all).reject { |x| x.has_parent? }
Muchas gracias a todos, con todo lo que me habéis dicho ya podré hacer
algo
interesante.
On Aug 14, 2007, at 9:54 AM, Paco García wrote:
‘has_many :categories, :class_name => “Category”, :foreign_key =>
“parent_id”’ y ‘belongs_to :category’? ¿o con poner
‘act_as_tree :order => “nombre”’ me lo puedo ahorrar?
acts_as_tree es basicamente equivalente al has_many/belongs_to que
colocas alli.
Segunda duda: ¿Como puedo hacer para obtener ÚNICAMENTE las hojas
del árbol (es decir todos las nombres de las categorías que no
tengan hijos?
No hay forma de hacer eso en SQL, excepto quizas con un select
anidado, algo como
SELECT * FROM categories WHERE id NOT IN (SELECT DISTINCT(parent_id)
FROM categories)
Pero eso seria bastante costoso y practicamente imposible de optimizar.
La solucion es desnormalizar de alguna manera. Por ejemplo, agregando
un campo “cuantos_hijos” que sea actualizado con algun “before_save”
o que se yo.