我想以最简单的方式模拟以下内容:
技能有许多依赖技能。
每项技能都应该独立存在,技能可能具备其他技能,这些技能是必备技能。
例如:
Skill: Front-End Development Has Dependent Skills -> [HTML, CSS, SCSS]
Skill: Web-Design Has Dependent Skills -> [HTML, CSS]
Skill: HTML
我希望能够做到:
@front_end_development.dependent_skills ##or a more semantic mapping
我可能想走上树,但我想不出最好的名字。也许我想通过HTML引用Web-Design依赖它。
让这种自我指涉是否有意义,或者事实是这会伤害我的大脑代码味道并乞求其他东西是理想的?这一切都取决于其他技能的技能。
使用mongo对此进行建模会更好吗?
答案 0 :(得分:1)
每次需要检索技能的所有依赖项时,您可能只是在向特定技能添加新依赖项时迭代隐含的依赖项,而不是在树中迭代(实际上更像是有向图);一个名为“Dependency”的表,它将技能映射到依赖关系,反之亦然。例如(关系可能更好):
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)