2012-07-17 2 views
0

가장 쉬운 방법으로 다음을 모델링하고 싶습니다.많은 부모와 많은 자기 - 참조 관계를 모델링하는 방법은 무엇입니까?

스킬에 많은 의존 기술이 있습니다.

각 스킬은 각각 독립적으로 존재해야하며 스킬은 전제 조건 스킬 인 다른 스킬을 가질 수 있습니다. 내가 좋아하는 것

Skill: Front-End Development Has Dependent Skills -> [HTML, CSS, SCSS] 
Skill: Web-Design Has Dependent Skills -> [HTML, CSS] 
Skill: HTML 

할 할 수 있도록 : 예를 들어

@front_end_development.dependent_skills ##or a more semantic mapping 

아마 트리를 걸어 싶습니다하지만 난 최선을 생각할 수 없다 그렇게 할 이름. 아마도 나는 HTML을 통해 웹 디자인이 그것에 의존한다고 언급하고 싶습니다.


은이 자기 참조 할 의미가 있는가 또는이 코드 냄새와 뭔가 다른 이상적인 것을 구걸 내 머리를 아프게된다는 사실이다? 그것은 모두 다른 기술에 의존하는 기술에 이릅니다.

mongo를 사용하여 모델링하는 것이 더 좋습니까?

+0

내가 의미를 사랑; 의미론을 적절하게 사용하면 모델링을보다 쉽게 ​​파악할 수 있습니다. 나는 너무 추상적이어서 지식을 깨뜨리지 않으며 더 중요한 일에 뇌의 힘을 사용합니다. 어쨌든, 나는 [ancestry gem] (https://github.com/stefankroes/ancestry)이 추상적 인 방법으로 나의 욕구를 해결할 수 있다고 생각한다. 생각? –

+0

나는 조상이 도움이 될지 모른다. 조상은 나무 구조를 가정합니다. 여러 부모가 필요합니다. 트리는 간단한 "parent_id"로 모델링 할 수 있지만 여러 개의 부모를 사용하면 조인 테이블이 필요할 가능성이 더 높습니다. –

답변

1

스킬에 대한 모든 종속성을 검색해야 할 때마다 트리를 반복하는 대신 (사실 직접 그래프와 비슷 함) 특정 스킬에 새 종속성을 추가 할 때 묵시적 종속성을 반복하고이를 저장할 수 있습니다 스킬을 의존성에 매핑하고 반대의 경우도 마찬가지입니다.

class Skill 
    has_many :dependers, class_name: 'Dependency', foreign_key: :dependee_id 
    has_many :dependees, class_name: 'Dependency', foreign_key: :depender_id 

    has_many :dependencies, through: :dependees 
    has_many :depending, through: :dependers 

    def add_dependency(skill) 
     recurse_dependencies(skill) 
    end 

    def recurse_dependencies(skill) 
     # perform this check to avoid circular and duplicate dependencies 
     if !depender_ids.include?(skill.id) && !dependee_ids.include?(skill.id) 
      dependee_ids << skill.id 
     end 

     skill.dependencies.each do |dependency| 
      recurse_dependencies(dependency) 
     end 
    end 
end 

class Dependency 
    belongs_to :dependee 
    belongs_to :depender 
end 

당신은 다음과 같은 일을 할 수 있어야한다 : 예 (관계가 더 좋은 말로 할 수있다)에 대한

@front_end_development.dependencies 
@front_end_development.depending 
@front_end_development.add_dependency(@html) 
관련 문제