2012-07-17 480 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)