0

내 범주를 처리하기위한 재귀 트리 구조가 있습니다. 각 리프 카테고리는 0 개 이상의 거래를 가질 수 있습니다. 다음과 같은 범주가리프 노드가 아닌 경우 재귀 트리 구조의 자식 특성을 가져옵니다.

class Category < ActiveRecord::Base 
    has_many :sub_categories, class_name: "Category", foreign_key: "parent_category_id" 
    belongs_to :parent_category, class_name: "Category" 

    has_many :deal_categories 
    has_many :deals, through: :deal_categories 

    def leaf? 
    !has_sub_categories? 
    end 

    def has_sub_categories? 
    !sub_categories.empty? 
    end 
end 

DealsDealCategories에 의해 정의된다 보인다 :

class Deal < ActiveRecord::Base 
    has_many :deal_categories 
    has_many :categories, through: :deal_categories 
end 

class DealCategory < ActiveRecord::Base 
    belongs_to :deal 
    belongs_to :category 
end 

Deals잎 카테고리로 존재할 수 있는지 확인하고 몇 가지 검증이있다. 따라서 리프 노드에서 category.deals을 호출하면 일부 거래가 발생하고 루트 노드에서 호출하면 빈 결과가 표시됩니다. 문제 없다.

하지만 지금은 category.deals이 루트 노드가 아닌 경우 자녀의 거래를 반환하겠습니다. 다음과 같이 나의 접근 방식은 내 Category 클래스에 다음 메소드를 오버라이드 (override) 할 수있다 :

alias_method :original_deals, :deals 
    def deals 
    if leaf? 
     self.original_deals 
    else 
     self.sub_categories.deals 
    end 
    end 

내가 sub_categories에 직접 deals를 호출 할 수 없기 때문에 이것은 그러나 작동하지 않는 오류가

undefined method `deals' for #<Category::ActiveRecord_Associations_CollectionProxy:0x00000009243d40> 

어떻게

인 이 문제를 해결합니까?

답변

0

sub_categories는 카테고리가 아니기 때문에 거래를 호출 할 수 없습니다 ... 카테고리의 모음입니다. 대신 당신은 감소하여

sub_categories.reduce([]) { |union, sub_category| union + sub_category.deals } 

같은 (노조 변수로 표현) 메모 객체와 블록의 평가는 새로운 메모 객체가됩니다 생성 할 수 있습니다. 빈 배열로 시작하여 sub_categories 컬렉션의 각 sub_category에 거래를 호출 한 결과를 추가합니다.

관련 문제