Istället för att iterera genom trädet (mer som en riktad graf faktiskt) varje gång du behöver hämta alla beroenden för en färdighet, kan du bara iterera genom de underförstådda beroenden när du lägger till ett nytt beroende till en viss färdighet och spara dessa i en tabell som heter 'Beroende' som mappar en färdighet till ett beroende och vice versa. Till exempel (relationerna skulle kunna formuleras bättre):
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 då kunna göra saker som:
@front_end_development.dependencies
@front_end_development.depending
@front_end_development.add_dependency(@html)