2011-05-20 193 views
1

我想弄清楚模型之間的複雜關係。 我有一個名爲「概念」的模型,它有兩種繼承類型,稱爲「技能」和「職業」。基本上,這意味着每個概念都代表一個類別,但是當深入到hierychal樹中時,概念也可以是技能或職業。has_many孩子和has_many父母

我正在通過使用STI來解決這個問題。所以,我的概念表模式是這樣的:

class CreateConcepts < ActiveRecord::Migration 
    def self.up 
    create_table :concepts do |t| 
     t.string :uri, :null => false, :length => 255 
     t.string :type, :null => true, :length => 255 
     t.integer :isco_code, :null => true 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :concepts 
    end 
end 

類型列determins概念是否是一個真正的「概念」或「技能」 /「職業」。 現在的問題但是以下關係:

編輯:

  • 一個概念可以屬於單親概念
  • 一個職業可以屬於單親概念
  • 一技能可以屬於多個父母概念
  • 技能沒有孩子
  • 的職業有沒有孩子

所以basicly你有這樣的事情:

>        concept1 
>     concept2     concept3 
>  concept4  concept5  concept6  concept7 skill1 
> occup1 skill2 occup2 skill5 
> occup7 skill2 occup3 skill4 
> occup4 skill1 occup8 

我希望畫面有點不清楚是什麼,我試圖解釋。 目前我已經創建了以下遷移來嘗試解決的父子關係,但我不知道如何與關聯都這樣......

class CreateConceptLinks < ActiveRecord::Migration 
    def self.up 
    create_table :concept_links do |t| 
     t.integer :parent_id, :null => false 
     t.integer :child_id, :null => false 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :concept_links 
    end 
end 

我想直到結束是以下posssibilities:

concepta.parents => a Concept object 
conceptb.children => an array of Conept objects 
Occupation.parents => a Concept object 
Occupation.children => [] 
Skill.parents => an array of Concept objects 
Skill.children => [] 

希望這甚至有可能...

+0

我可以自己實現它使用類的自定義屬性,但我希望如果協會可以解決它 – 2011-05-20 09:31:58

回答

4

您還可以模擬在軌等級關係。在遷移過程中,你已經完成了大部分任務。添加下面的關係應該允許你做的方法調用你想:

def Concept < ActiveRecord::Base 
    has_many :child_links, :class_name => 'ConceptLink', :foreign_key => 'parent_id' 
    has_many :children, :through => :child_links 

    has_many :parent_links, :class_name => 'ConceptLink', :foreign_key => 'child_id' 
    has_many :parents, :through => :parent_links 
end 

def ConceptLink < ActiveRecord::Base 
    belongs_to :child, :class_name => "Concept" 
    belongs_to :parent, :class_name => "Concept" 
end 

我也想看看this blog posting它做了很好的解釋軌道親子映射。

+0

感謝這一點。 不幸的是,由於需求的變化,我不得不分手我的STI模型......所以對於父母來說,它變得更容易。但很高興知道我在正確的軌道上 – 2011-05-20 13:08:12