Вместо да итерирате през дървото (всъщност по-скоро като насочена графика) всеки път, когато трябва да извлечете всички зависимости за дадено умение, можете просто да итерирате подразбиращите се зависимости, когато добавяте нова зависимост към конкретно умение и да ги запишете в таблица, наречена „Зависимост“, която преобразува умение в зависимост и обратно. Например (отношенията могат да бъдат формулирани по-добре):
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
След това трябва да можете да правите неща като:
@front_end_development.dependencies
@front_end_development.depending
@front_end_development.add_dependency(@html)