1

我想以最简单的方式模拟以下内容:

一个技能有很多从属技能。

每个技能都应该独立存在,并且一个技能可能有其他作为必备技能的技能。

例如:

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

我可能想爬上树,但我想不出最好的名字。也许我想通过 Web 设计所依赖的 HTML 来引用它。


进行这种自我引用是否有意义,或者这是否会伤害我的大脑是一种代码味道并乞求其他东西是理想的?这一切都归结为取决于其他技能的技能。

使用 mongo 对此进行建模会更好吗?

4

1 回答 1

1

每次您需要检索技能的所有依赖项时,不必遍历树(实际上更像是有向图),您可能只是在向特定技能添加新依赖项时遍历隐含的依赖项并将它们保存到名为“依赖关系”将技能映射到依赖关系,反之亦然。例如(关系可以更好地措辞):

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)
于 2012-07-18T00:03:45.033 回答