Alih-alih mengulangi melalui pohon (sebenarnya lebih seperti grafik terarah) setiap kali Anda perlu mengambil semua dependensi untuk suatu keterampilan, Anda mungkin hanya mengulangi melalui dependensi tersirat saat menambahkan ketergantungan baru ke keterampilan tertentu dan menyimpannya ke tabel yang disebut 'Ketergantungan' yang memetakan keterampilan ke ketergantungan dan sebaliknya. Misalnya (hubungannya bisa lebih baik kata-katanya):
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
Anda kemudian harus dapat melakukan hal-hal seperti:
@front_end_development.dependencies
@front_end_development.depending
@front_end_development.add_dependency(@html)