如何与许多父母建立许多自我指涉关系?

时间:2012-07-17 23:17:22

标签: ruby-on-rails mongodb database-design activerecord

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

技能有许多依赖技能。

每项技能都应该独立存在,技能可能具备其他技能,这些技能是必备技能。

例如:

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对此进行建模会更好吗?

1 个答案:

答案 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)