I stedet for at iterere gennem træet (mere som en rettet graf faktisk) hver gang du skal hente alle afhængigheder for en færdighed, kan du måske bare gentage de underforståede afhængigheder, når du tilføjer en ny afhængighed til en bestemt færdighed og gemme disse i en tabel kaldet 'Afhængighed' som kortlægger en færdighed til en afhængighed og omvendt. For eksempel (relationerne kunne være bedre formuleret):
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
Du bør derefter være i stand til at gøre ting som:
@front_end_development.dependencies
@front_end_development.depending
@front_end_development.add_dependency(@html)