Avec presque un an de retard, mais je pense qu'il est toujours utile de prolonger ma réponse. Vous aurez besoin d'un ID pour chaque tâche, supposons que cet ID soit le nom de la tâche. Ensuite, avec un nouvel attribut parent dans la tâche, vous serez en mesure de persister l'arborescence pour le composite :
class Task
attr_reader :name
attr_reader :parent
def initialize(name, parent=nil)
@name = name
= parent
end
def get_time_required
0.0
end
end
De cette façon, vous pourrez naviguer du parent vers ses enfants. select * from tasks where parent_id = ?
ou d'un enfant à son parent select * from tasks where id = ?
.
Une autre astuce consiste à utiliser l'indexation, comme dans les chapitres, pour retrouver toute la hiérarchie sous un nœud donné. Si vous avez un tree_code
classé, alors vous pouvez persister de cette façon :
- Le nœud racine aura 0
tree_code
,
- Les enfants de Root auront 1, 2, 3,...
tree_code
(il s'agit de la première génération)
- deuxième génération pour le nœud avec
tree_code
1 aura 1.1, 1.2,... tree_code
. Pour le nœud avec tree_code
2 aura 2.1, 2.2,... tree_code
- etc.
alors vous serez en mesure de récupérer tous les sous-nœuds de la tâche 1 en interrogeant select * from tasks where tree_code like '1.%'
.
Il s'agit toujours d'un compromis en termes de performances entre l'insertion/la mise à jour et la sélection, car vous devrez calculer le paramètre tree_code
avant de faire persister un composant.
Si vous êtes dans le contexte d'une application Rails, vous pouvez toujours utiliser ascendance