Thay vì lặp qua cây (thực sự giống như một biểu đồ có hướng) mỗi khi bạn cần truy xuất tất cả các phụ thuộc cho một kỹ năng, bạn có thể chỉ cần lặp qua các phụ thuộc ngụ ý khi thêm một phụ thuộc mới vào một kỹ năng cụ thể và lưu chúng vào một bảng có tên 'Sự phụ thuộc' ánh xạ một kỹ năng đến một sự phụ thuộc và ngược lại. Ví dụ:các quan hệ có thể được diễn đạt tốt hơn):
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
Sau đó, bạn sẽ có thể làm những việc như:
@front_end_development.dependencies
@front_end_development.depending
@front_end_development.add_dependency(@html)