1

モデル間の複雑な関係を理解し​​ようとしています。「Skill」と「Occupation」という2つの継承タイプを持つ「Concept」というモデルがあります。基本的に、これは各概念がカテゴリを表すことを意味しますが、概念は、階層ツリーに十分深く入る場合のスキルまたは職業になることもあります。

私はSTIを使用してこの階層を解決しています。したがって、Conceptsテーブルのスキーマは次のようになります。

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

タイプ列は、コンセプトが実際の「コンセプト」であるか「スキル」/「職業」であるかを決定します。ただし、問題は次の関係にあります。

編集:

  • コンセプトは、単一の親コンセプトに属することができます
  • 職業はひとり親の概念に属することができます
  • スキルは複数の親コンセプトに属することができます
  • スキルには子供がいません
  • 職業には子供がいません

基本的に、次のようなものがあります。

>                             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

最終的には、次の可能性があります。

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 => []

これが可能であることを願っています...

4

1 に答える 1

5

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

Railsでの親子マッピングを説明するのに非常に役立つこのブログ投稿も見てみたいと思います。

于 2011-05-20T11:09:26.250 に答える