cod*_*nny 1 ruby-on-rails database-relations associations
我试图找出模型之间的复杂关系。我有一个名为“Concept”的模型,它有两个继承类型,称为“Skill”和“Occupation”。基本上这意味着每个概念代表一个类别,但是当深入到层次树中时,一个概念也可以是一种技能或职业。
我正在通过使用 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
Run Code Online (Sandbox Code Playgroud)
类型列确定概念是真正的“概念”还是“技能”/“职业”。然而现在的问题是以下关系:
编辑:
- 概念可以属于单个父概念
- 一个职业可以属于一个单亲概念
- 一个技能可以属于多个父概念
- 技能没有子级
- 职业没有孩子
所以基本上你会有这样的事情:
> concept1
> concept2 concept3
> concept4 concept5 concept6 concept7 skill1
> occup1 skill2 occup2 skill5
> occup7 skill2 occup3 skill4
> occup4 skill1 occup8
Run Code Online (Sandbox Code Playgroud)
我希望图片有点清楚我要解释的内容。目前我已经创建了以下迁移来尝试解决父子关系,但我不确定如何将其与关联映射...
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
Run Code Online (Sandbox Code Playgroud)
我想要结束的是以下可能性:
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 => []
Run Code Online (Sandbox Code Playgroud)
希望这甚至是可能的......
您可以在 rails 中为层次关系建模。您已经完成了大部分迁移。添加下面的关系应该允许您执行您想要的方法调用:
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
Run Code Online (Sandbox Code Playgroud)
我还会看一下这篇博客文章,它很好地解释了 Rails 中的父子映射。
| 归档时间: |
|
| 查看次数: |
2500 次 |
| 最近记录: |