2012-07-17 61 views
0

我想用最简单的方式建立如下模型:如何建立与许多父母的许多自我指涉关系?

一项技能有许多相关技能。

每项技能都应该有自己的存在,并且一项技能可能具有其他技能是必备技能。

例如:

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设计依赖它。


是否有意义使这个自我指涉或事实是这是伤害我的大脑代码气味,并乞求别的是理想的?这一切都取决于其他技能的技能。

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

+0

我爱语义;恰当地使用语义使得建模更易于掌握。我尽量不要太抽象,因为它会打破理解,我宁愿用我的大脑力量去做更重要的事情。无论如何,我认为[祖先宝石](https://github.com/stefankroes/ancestry)可以用抽象方法解决我的需求。思考? – 2012-07-17 23:27:59

+0

我不知道祖先会有帮助。祖先假设一个树形结构 - 你需要多个父母,这更像是一个有向图。一棵树可以用一个简单的“parent_id”来建模,但是对于多个父母,你更可能需要一个连接表。 – 2012-07-17 23:53:37

回答

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)