2012-06-11 4 views
2

나는 github에서 acts_as_tree와 ancestry gem을 보았지만 그들이 원하는 것을하지는 않는다고 생각합니다. 나는 검색을했지만, 내가 시도했던 것에 맞는 것을 찾을 수 없었다.ancestory와의 모델 가족 관계?

기본적으로 페이지가있는 CMS입니다. 페이지는 제목입니다 : 문자열과 본문 : 텍스트. 페이지는 다른 페이지 아래에 중첩 될 수 있으며 다른 페이지를 중첩 할 수 있습니다.

따라서, 예를 들어, 모든는 "페이지"

hardware 
hardware/servers 
hardware/servers/server1 
hardware/servers/server1/parts/powersupply 

내가 이상적으로 servers.children 수 있고 자녀 나 손자뿐만 아니라 수 있습니다.

이렇게 괜찮습니다. acts_as_tree 등은 이것으로 좋습니다.

하지만 내가하고 싶은 것은이 페이지의 관계뿐만 아니라입니다 :

hardware/servers/server1 
equipment/IT/server1 
maintenance/monthly/server1/ 

정도

friends/sally 
coworkers/sally 

, 나는 나는 그것이 많은 부모가 할 것 같아요? 그런 식으로. 나는 다양한 '경로'에서 같은 페이지에 액세스 할 수 있기를 원합니다.

그래서 어떻게 될지 모르겠습니다. 나는 이전에 단순히 parent_id였던 것처럼 "has_many"의 무언가가 있기 때문에 어떤 종류의 조인 모델을 할 것인가?

답변

0

부모가 많으면이 두 모델 중 하나에 적합하지 않을 수도 있습니다. 대신 그래프를 구현하는 것이 좋습니다. 귀하의 설명을 토대로 아마 그것은 비순환적일 것입니다. 즉, 어떤 루프도 없거나 다른 말로하면 페이지 자체가 결코 자식이 아니기 때문에 특정 최적화로 이어질 수 있습니다.

여기에서 사용할 일반적인 패턴은 페이지 간의 다 대다 관계입니다. 이를 위해 parentchild 사이의 조인 모델을 작성합니다. previous answer of mine에서 적응 예를 들어

: 당신을위한 관계 캐시에 대한 많은 정보가 조상을 사용하는 것만 큼 효율적 않을거야

class Page < ActiveRecord::Base 
    has_many :parent_page_links, 
    :class_name => 'PageLink', 
    :foreign_key => :child_id 

    has_many :parents, 
    :through => :parent_page_links, 
    :source => :parent 

    has_many :child_page_links, 
    :class_name => 'PageLink', 
    :foreign_key => :parent_id 

    has_many :children, 
    :through => :child_page_links, 
    :source => :child 
end 

class PageLink < ActiveRecord::Base 
    belongs_to :parent, 
    :class_name => "Page" 
    belongs_to :child, 
    :class_name => "Page" 
end 

하지만 성능이 요구 사항 인 경우 이러한 기능 중 일부를이 구조로 이식 할 수 있습니다.

+1

감사합니다. stackoverflow 및 감사합니다, 당신이 tadman, 그것을 트릭을 할 것 같습니다. 나는 그것을 줄 것이며 다시보고 할 것이다. –