has_many дети и has_many родители - PullRequest
1 голос
/ 20 мая 2011

Я пытаюсь выяснить сложную связь между моделью.У меня есть модель под названием «Концепция», которая имеет два наследуемых типа: «Умение» и «Занятие».По сути, это означает, что каждый концепт представляет категорию, но концепт также может быть навыком или занятием, если углубиться в древо иерархии.

Я решаю эту иерархию, используя 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

Столбец типа определяет, является ли Концепция реальной «Концепцией» или «Умением» / «Занятием».Проблема теперь, однако, следующие отношения:

РЕДАКТИРОВАТЬ:

  • Концепция может принадлежать к одному родительскому понятию
  • AnПрофессия может принадлежать одному родителю. Концепция
  • Навык может принадлежать нескольким родителям. Концепции
  • У навыка нет детей
  • В профессии нет детей

так что в принципе у вас будет что-то вроде этого:

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

Надеюсь, что это даже возможно ...

1 Ответ

4 голосов
/ 20 мая 2011

Вы можете моделировать иерархические отношения в рельсах.Вы прошли большую часть пути с вашими миграциями.Добавление приведенных ниже отношений должно позволить вам выполнять вызовы методов, которые вам нужны:

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

Я бы также посмотрел на это сообщение в блоге , которое очень хорошо объясняетотображения родитель-ребенок в рельсах.

...