2011-05-20 199 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