2011-05-20 6 views
1

J'essaie de comprendre une relation complexe entre un modèle. J'ai un modèle appelé "Concept", qui a deux types d'héritage appelés "Compétence" et "Occupation". Fondamentalement, cela signifie que chaque concept représente une catégorie, mais un concept peut également être une compétence ou une occupation lorsque l'on va assez loin dans l'arbre hiéroglyphe. Je résous cette hiérarchie en utilisant STI. Donc, mon schéma pour la table Concepts ressemble à ceci:has_many enfants et has_many parents

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 

La colonne de type si le concept décrit que est un véritable « concept » ou une « compétence »/« Occupation ». Le problème maintenant cependant les relations suivantes:

EDIT:

  • Un concept peut appartenir à un seul parent Concept
  • Une profession peut appartenir à un seul parent Concept
  • A La compétence peut appartenir à plusieurs parents Concepts
  • Une compétence n'a pas d'enfants
  • Une occupation n'a pas d'enfant

vous auriez donc basiquement quelque chose comme ceci:

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

J'espère que l'image est un peu clair ce que je suis en train d'expliquer. Actuellement, je ont créé la migration suivante pour tenter de résoudre la relation parent-enfant, mais je ne suis pas sûr de savoir comment la carte collaboration avec les associations ...

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 

Ce que je veux finir avec est le suivant 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 => [] 

Espérons que cela est même possible ...

+0

Je peux probablement l'implémenter moi-même en utilisant des attributs personnalisés sur les classes, mais j'espérais que les associations puissent le résoudre –

Répondre

4

Vous pouvez modéliser les relations hiérarchiques dans les rails. Vous avez la plupart du chemin avec vos migrations. L'ajout des relations ci-dessous devrait vous permettre de faire la méthode que vous souhaitez appelle:

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 

Je voudrais aussi jeter un oeil à this blog posting qui fait un très bon d'expliquer les correspondances entre parents et enfants dans des rails.

+0

merci pour cela. Malheureusement, en raison des changements d'exigences, j'ai dû briser mon modèle STI ... donc pour le parent, c'est devenu beaucoup plus facile. Mais heureux de savoir que j'étais sur la bonne voie –