Forum: Italian Ruby user group ordinamento di un albero: possibili migliorie?

Posted by Andrea Pavoni (Guest)
on 2009-06-19 18:26
(Received via mailing list)
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.
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.