2009-08-28 8 views

Répondre

1

déjà mis en œuvre dans awesome_nested_set

order_column: sur la colonne à faire le tri, par défaut c'est le left_column_name.Exemple: acts_as_nested_set: order_column => : Position

et closure_tree

Si vous voulez un ordre spécifique, ajouter une nouvelle colonne entière à votre modèle dans une> migration:

t.integer :sort_order 

et dans votre modèle:

class OrderedTag < ActiveRecord::Base 
    has_closure_tree order: 'sort_order' 
end 
2

Malheureusement, il est maintenant impossible. Dans leur classe écrite que "odering par une autre colonne que lft ne fonctionne pas" (lib/awesome_nested_set.rb)

+2

2 et quelques années plus tard, cela semble toujours être le cas? – gef

+2

qu'en est-il 3 ans plus tard? – Gediminas

+2

Pour ce que ça vaut, j'ai pu faire un tri de base de données avec ceci: @ item.children.except (: order) .order ("your_sort_column") –

1

Je confirme ce que @ kr00lix dit. Ma façon de contourner ce problème:

@item_children = @item.children 
@item_children = @item_children.sort_by!(&:your_sort_column) 

Mais je suis d'accord que, afin d'éviter la consommation de mémoire inutile, il serait beaucoup plus agréable de définir l'ordre dans la commande SQL directement.

5

Faire cela outrepasse le genre de base de données:

@item.children.except(:order).order("your_sort_column") 

Exemple:

organization.self_and_descendants.to_sql 
=> "SELECT `organizations`.* FROM `organizations` WHERE (`organizations`.`lft` >= 1 AND `organizations`.`lft` < 54) ORDER BY `organizations`.`lft`" 

organization.self_and_descendants.except(:order).order("organization_nm").to_sql 
=> "SELECT `organizations`.* FROM `organizations` WHERE (`organizations`.`lft` >= 1 AND `organizations`.`lft` < 54) ORDER BY organization_nm" 
0

j'ai pu le faire dans Rails avec récursion:

def add_self_and_children 
    [self, children.sort_by{|e| e.name}.map{|c| c.add_self_and_children}].flatten 
end 

appellent ensuite Model.root.add_self_and_children.

Mais il est évident que cela implique une série d'accès massifs à la base de données.

Donc, si quelqu'un qui en sait plus sur la récursivité SQL que je veux convertir cela en SQL pur, ce serait magique!

BTW, pour une raison quelconque ce qui suit, ce qui aurait été un peu kinder sur la base de données, ne fonctionne pas:

def add_self_and_children 
    [self, children.order(:name).map{|c| c.add_self_and_children}].flatten 
end 
Questions connexes