# Ordinamento di un albero: possibili migliorie?

**URL:** <https://www.ruby-forum.com/t/ordinamento-di-un-albero-possibili-migliorie/170615>\
**Category:** IT\
**Created:** [June 19, 2009, 6:26pm UTC](https://www.ruby-forum.com/t/ordinamento-di-un-albero-possibili-migliorie/170615 "2009-06-19T18:26:43Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![stanley](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/7ab992/32.png) [@stanley](https://www.ruby-forum.com/u/stanley)\
**Post date:** [June 19, 2009, 6:26pm UTC](https://www.ruby-forum.com/t/ordinamento-di-un-albero-possibili-migliorie/170615/1 "2009-06-19T18:26:43Z")

</div>

ciao a tutti =)

per gestire contenuti _innestati_ (nel mio caso si tratta di pagine con  
eventuali sotto-pagine), ho sfruttato il plugin acts\_as\_category.

con un po’ di codice javascript, ho inserito la possibilità di spostare  
elementi di una lista per cambiare ordine e/o innestarli tra loro.

la richiesta generata dal javascript, ha una forma simile alla seguente:  
{“pagelist”=\>{“0”=\>{“id”=\>“2”, “children”=\>{“0”=\>{“id”=\>“1”}}},  
“1”=\>{“id”=\>“3”}, “2”=\>{“id”=\>“4”}}}

c’è una lista di items, ciascuno con un ‘id’ ed un eventuale ‘children’  
che può contenere altri items.

il codice che ho scritto funziona, però sono perplesso perchè secondo me  
potrebbe essere migliorato, ecco il metodo:

def update\_page\_order  
def params\_tree\_parser(root, with\_father=0, position = 0)  
root.each do |child|  
child.each do |subc|  
if subc.is\_a?(Hash)  
if with\_father \> 0  
Page.update(subc[“id”].to\_i , :parent =\>  
Page.find(with\_father), :position =\> (position += 1))  
else  
Page.update(subc[“id”].to\_i, :parent =\> nil, :position =\>  
(position += 1))  
end  
if subc.has\_key?(“children”)  
params\_tree\_parser(subc[“children”], subc[“id”].to\_i)  
end  
end  
end  
end  
end  
params\_tree\_parser(params[:pagelist]) if params[:pagelist]  
render :nothing =\> true  
end

è un metodo ricorsivo che chiama N volte questo comando:  
Page.update(subc[“id”].to\_i , :parent =\> Page.find(with\_father),  
:position =\> (position += 1))

un ordinamento potrebbe richiedere diverse query, è anche vero che sono  
operazioni una-tantum fatte nella sezione admin, tuttavia mi piacerebbe  
sapere da qualcuno più preparato, se c’è un modo migliore per ottenere  
lo stesso risultato =P

grazie in anticipo,  
A.
