has_many孩子和has_many父母
问题描述:
我想弄清楚模型之间的复杂关系。 我有一个名为“概念”的模型,它有两种继承类型,称为“技能”和“职业”。基本上,这意味着每个概念都代表一个类别,但是当深入到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 => []
希望这甚至有可能...
答
您还可以模拟在轨等级关系。在迁移过程中,你已经完成了大部分任务。添加下面的关系应该允许你做的方法调用你想:
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
我可以自己实现它使用类的自定义属性,但我希望如果协会可以解决它 – 2011-05-20 09:31:58