Anstatt jedes Mal, wenn Sie alle Abhängigkeiten für eine Fertigkeit abrufen müssen, durch den Baum zu iterieren (eigentlich eher wie ein gerichteter Graph), können Sie einfach die implizierten Abhängigkeiten durchlaufen, wenn Sie einer bestimmten Fertigkeit eine neue Abhängigkeit hinzufügen, und diese in einer aufgerufenen Tabelle speichern „Abhängigkeit“, die eine Fertigkeit einer Abhängigkeit zuordnet und umgekehrt. Zum Beispiel (die Relationen könnten besser formuliert werden):
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
Sie sollten dann Dinge tun können wie:
@front_end_development.dependencies
@front_end_development.depending
@front_end_development.add_dependency(@html)