Au lieu d'itérer dans l'arborescence (plus comme un graphe orienté en fait) chaque fois que vous avez besoin de récupérer toutes les dépendances d'une compétence, vous pouvez simplement parcourir les dépendances implicites lors de l'ajout d'une nouvelle dépendance à une compétence particulière et les enregistrer dans une table appelée « Dépendance » qui associe une compétence à une dépendance et vice versa. Par exemple (les relations pourraient être mieux formulées) :
class Skill
has_many :dependers, class_name: 'Dependency', foreign_key: :dependee_id
has_many :dependees, class_name: 'Dependency', foreign_key: :depender_id
has_many :dependencies, through: :dependees
has_many :depending, through: :dependers
def add_dependency(skill)
recurse_dependencies(skill)
end
def recurse_dependencies(skill)
# perform this check to avoid circular and duplicate dependencies
if !depender_ids.include?(skill.id) && !dependee_ids.include?(skill.id)
dependee_ids << skill.id
end
skill.dependencies.each do |dependency|
recurse_dependencies(dependency)
end
end
end
class Dependency
belongs_to :dependee
belongs_to :depender
end
Vous devriez alors pouvoir faire des choses comme :
@front_end_development.dependencies
@front_end_development.depending
@front_end_development.add_dependency(@html)