Em vez de iterar pela árvore (mais como um gráfico direcionado na verdade) cada vez que você precisar recuperar todas as dependências de uma habilidade, você pode apenas iterar pelas dependências implícitas ao adicionar uma nova dependência a uma habilidade específica e salvá-las em uma tabela chamada 'Dependência' que mapeia uma habilidade para uma dependência e vice-versa. Por exemplo (as relações poderiam ser melhor redigidas):
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
Você deve então ser capaz de fazer coisas como:
@front_end_development.dependencies
@front_end_development.depending
@front_end_development.add_dependency(@html)