J'utilise le L'arborescence de la base de données est construite comme prévu. Toutes les valeurs de MAINTENANT, je veux rendre toutes les catégories d'un client donné dans un arbre correctement triché de structure: Par exemple, Nettères Mise à jour: strong> a compris qu'il est possible de calculer le nombre de Enfants pour tout nœud donné dans l'arborescence sans autre requête SQL: awesome_netés_set_set code>
plugin dans mon projet My Rails. J'ai deux modèles qui ressemblent à ceci (simplifié): parent_id code>,
lft code> et
rgt code> sont corrects. L'arbre a plusieurs nœuds racines (ce qui est bien sûr autorisé dans
awesome_netés_set_set code>). P>
code> tags. Ce ne serait pas trop difficile, mais j'en ai besoin d'être efficace (moins les requêtes SQL sont mieux meilleures). P>
number_of_children = (nœud.rgt - nœud.lft - 1) / 2 code>. Cela ne résout pas le problème, mais cela peut s'avérer utile. P> p>
7 Réponses :
Vous devez faire de manière récursive une partielle qui s'appellera elle-même. Quelque chose comme ceci: c'est des rails 2.3 Code. Vous devrez appeler les itinéraires et nommer le partiel explicitement avant cela. P> p>
Ouais, j'ai moi-même trouvé la même solution moi-même. Le problème est que chaque appel à enfants code> exécute une requête SQL supplémentaire (100 sous-arbres = 100 requêtes SQL). Entraîne un problème classique N + 1. C'est exactement ce que j'essaie d'éviter. En outre: le premier appel partiel de rendu devrait être quelque chose comme
<% = rendu: partiel => @ Customer.Catégories.roots%> code>
J'ai répondu à un Question similaire Pour PHP récemment (Set imbriqué == Modèle de travers de pré-commande pré-commande modifié). P>
Le concept de base est d'obtenir les nœuds déjà commandés et avec un indicateur de profondeur au moyen d'une requête Je ne connais pas le fichier awesome_netés_set_set code> plug in, mais il peut déjà contenir une option pour obtenir la profondeur annotée, indiquée, car il s'agit d'une jolie opération / besoin standard lorsqu'il s'agit de ensembles. p>
Ce serait bien si les ensembles imbriqués avaient de meilleures fonctionnalités hors de la boîte ne le feraient pas.
Le truc tel que vous avez découvert consiste à construire l'arbre à partir d'un ensemble plat: p>
Voir ci-dessous: P>
def tree_from_set(set) #set must be in order buf = START_TAG(set[0]) stack = [] stack.push set[0] set[1..-1].each do |node| if stack.last.lft < node.lft < stack.last.rgt if node.leaf? #(node.rgt - node.lft == 1) buf << NODE_TAG(node) else buf << START_TAG(node) stack.push(node) end else# buf << END_TAG stack.pop retry end end buf <<END_TAG end def START_TAG(node) #for example "<li><p>#{node.name}</p><ul>" end def NODE_TAG(node) "<li><p>#{node.name}</p></li>" end def END_TAG "</li></ul>" end
Cela marche. Vous avez raison en ce qui concerne Awesome_neDe_set. Je ne peux pas m'empêcher de me demander pourquoi cela n'est pas intégré au plugin en premier lieu. THX!
J'ai oublié de mentionner: Le point essentiel de votre solution est que cela ne nécessite qu'une seule requête SQL!
_tree.html.eb _item.html.erb p> Vous pouvez également trier leur suivant: p> < Pré> xxx pré> mais dans ce cas, vous devez supprimer cette ligne: p>
Depuis septembre 2009, un ensemble imbriqué génial comprend une méthode spéciale pour le faire: https://github.com/collectiveidea/awesome_nested_set/commit/9fcaaff3d6b351b11c4b40dc1f3e37f33d0a8cbe p>
Cette méthode est beaucoup plus efficace que le niveau d'appel, car il ne nécessite aucune requête de base de données supplémentaire. P>
Exemple: catégorie.each_with_level (catégorie.root.elf_and_descendants) Do | O, niveau | p>
Je ne pouvais pas faire travailler la réponse acceptée à cause de la vieille version de Ruby, je suppose. Voici la solution qui fonctionne pour moi: Il est simplifié en utilisant les informations en option em> de profondeur.
(L'avantage de cette approche est qu'il n'est pas nécessaire que l'entrée définie soit la structure entière sur les feuilles.) P> solution plus complexe sans profondeurs ne peut être trouvée sur Github Wiki de la gemme: P >
Peut-être un peu de retard mais j'aimerais partager ma solution pour Cela fonctionnera avec n'importe quelle portée commandé par que d'utiliser l'assistant pour le rendre: p> awesome_nemet_set_set code> basé sur
fermeture_tree code> gem nié
hash_tree code>
méthode: lft code> p>