2013-03-01 2 views
2

여러 트리의 개체를 특성을 반영하고 탐색을 빌드하기 위해 범주화하려고합니다.레일 : 단일 항목에 대한 여러 트리

그래서, 주어진 다음 나무 :

Category1 
-Category-1-1 
-Category-1-2 

Category2 
-Category-2-1 
-Category-2-2 
--Category-2-2-1 

객체는 예를 들어, 수 카테고리 1-2와 카테고리 2-2-1에 속합니다.

목표는 데이터베이스에서 모든 개체를 가져올 수있을 것입니다 특정 카테고리 또는 그 자손 만에 속하는 특정 카테고리

  • 에 속하는

    더 실용적인에게 예 :

    카테고리에는 'Tools> Gardening Tools> Cutters'의 계층 구조가있을 수 있습니다.

    번째 카테고리 '단단한 물체> 금속 오브젝트> 금속 조각'

    목적 '가위'는 '커터'뿐만 아니라 '금속 조각'에 속하는 것으로 분류 될 것이다. > '가위'

  • 는 '원예 도구'의 모든 종류의 아이들 검색 - -> '커터'
  • 모든 검색 '을

    나는

    • 모든'원예 도구 '를 검색

      할 수 있도록하려면 하드 객체 '->'가위 커터 '또한'하드 객체의
    • 모든 검색 ''-> '가위'
    • 모든 검색 '커터' '또한'소프트 개체 -> [] 모든 포인터를 ? 나는 closure_tree, awesome_nested_sets 등을 잠깐 살펴 봤지만 좋은 매치인지는 확신 할 수 없다.
  • 답변

    4

    난 그냥 이런 짓을하고 난 조상을 사용하지 않도록 선택했지만 closure_tree. 카테고리들 사이에`has_and_belongs_to_many '가 필요하다는 것을 알고 있습니다 (하나의 객체에 여러개를 추가 할 때마다 태그를 호출하기를 좋아합니다).

    이제 파인더에서 나쁜 소식은 독자적인 사용자 지정 쿼리가 없으면 사용자 지정 쿼리를 사용하지 못할 수도 있다는 것입니다.

    Item.joins(:tags).where(tags: {id: self_and_descendant_ids }) 
    

    코드는 깨끗하고 두 쿼리의 descendant_ids 하나와 객체의 다른 하나를 실행합니다 : 보석의 방법을 사용하면 같은 일을 할 것입니다. 이것의 약간의 변형은 마지막을 제외한 모든 것에 대해 필요한 것을 제공해야합니다. 그 중 하나는 힘들고 그것을 구현하지 않았습니다 (나는 진행 중입니다).

    지금은 (검색어 개수 : 2), 해당 태그의 모든 항목 (검색어 개수 : 4) 및 교차로 모두에 전화해야합니다. 그런 다음에는 심각한 리펙토링이 필요합니다. 우리가 쿼리의 수를 줄이기 위해 SQL을 작성해야한다고 생각합니다. 레일스 쿼리 인터페이스로 충분하지 않을 것이라고 생각합니다.

    * closure_tree *를 선택한 또 다른 이유는 parent_id를 사용했기 때문에 다른 모든 Rails 연결과 마찬가지로 모든 형제가이를 공유하므로 다른 보석과 인터페이스하기가 더 쉽습니다 (예 : SortModel을 사용하여 정렬).

    +0

    저는 귀하의 답변을 정말 좋아했지만, 다른 사용자에게 현상금을 수여했습니다. 그 사람에게 더 적극적인 사용자가되도록 동기를 부여하기를 바랍니다. 나는 당신의 대답을 받아들이고 있습니다. –

    +0

    내가 도울 수있어서 기쁩니다! – Leito

    2

    나는 나무 보석 중 하나에 갈 수 있다고 생각하는데, 개인적으로 나는 Ancestry을 좋아합니다. 그런 다음 각 카테고리에 대해 많은 객체를 포함하는 연관성을 만들고 각 객체는 여러 카테고리에 속할 수 있습니다.

    이미 문제가 발생했거나 옵션을 조사 중이십니까?

    +0

    어쩌면 나는 Ancestry가 어떻게 작동 하는지를 오해하고 있습니다.하지만 하나의 나무에 개체를 넣을 수 있도록 허용하지 않습니까? –

    +0

    예, 트리 구조로 범주를 구성한 다음 각 노드 (범주)를 범주로 지정할 개체와 연결합니다. –

    5

    여기 코드는 모두 의사 코드입니다.

    저는 ancestry gem을 사용하고 3 가지 모델 클래스로 데이터를 모델링합니다. 이렇게하면 데이터가 표준화되며이를 기반으로 구축 할 수 있습니다.

    Category - ancestry tree 
        has_may Memberships 
        has_may Products through Memberships 
    
    Membership 
        belongs_to Category 
        belongs_to Products 
    
    Products 
        has_may Memberships 
        has_may Categories through Memberships 
    

    거기에서 당신은 효율적으로 수치를 수행하는 방법을 알아야합니다. 이 방법은 SQL을 사용하여이를 수행하는 방법을 이해하고 activercord의 DSL로 쿼리를 표현하는 방법을 파악하는 것입니다.

    일부 자원 :

    쿼리 예 :

    카테고리를 찾으십시오.

    Category.find(category_id)

    는 범주를 찾아서 지정된 카테고리 내 제품의 포함한다.

    Category.find(category_id).join(:memberships => :products)

    찾기 카테고리의 하위 트리 공업 제품

    Category.subtree_of(category_id).join(:memberships => :products)

    진단 제품이 속한 모든 범주 찾기를 포함한다. 저자가 빠른 나는 그에게 동의 말한다 때문에

    Product.find(product_id).categories

    +0

    매우 철저한 대답에 감사드립니다. –

    관련 문제