Im utilisant le awesome nested set plugin pour rubis sur les rails. Comment puis-je trier par: colonne de nom ou quelque chose?impressionnant ensemble imbriqué par
montre actuellement l'arbre comme
A
- C
- B
Je veux comme
A
- B
- C
Im utilisant le awesome nested set plugin pour rubis sur les rails. Comment puis-je trier par: colonne de nom ou quelque chose?impressionnant ensemble imbriqué par
montre actuellement l'arbre comme
A
- C
- B
Je veux comme
A
- B
- C
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
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)
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.
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"
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
Ceci a été mis à jour maintenant avec: order_column, merci à @askrynnikov pour le signaler –