2014-06-14 1 views
0

여기 내 방법입니다레일 루프을 각각 중첩 된 해시를 형성

def categories 
    @categories = {} 
    cat = Category.includes(:sub_categories).where('categories.status = ?', true).order(:id)   
    cat.each do |category| 
     category.sub_categories.each do |sub_category| 
      @categories[category.name] = { name: sub_category.name } 
     end 
    end 
    end 

내가 뭘하려고 휴대폰 내 category.name 가정

하고 내 sub_category.name 휴대 전화 브랜드 목록을 갖게됩니다. 하지만 위의 방법은 하나의 하위 카테고리 만 인쇄합니다. 그 이유는 이름이 가변적이지만 중첩 된 해시를 만드는 방법이기 때문입니다.

각 하위 범주에서 키를 덮어 쓰기 때문입니다이

답변

3

을하는 다른 적절한 방법. category.status 부울 인 경우도

def categories 
    @categories = {} 
    cat = Category.includes(:sub_categories).where('categories.status = ?', true).order(:id)   
    cat.each do |category| 
     category.sub_categories.each do |sub_category| 
      @categories[category.name] = [] unless @categories[category.name] 
      @categories[category.name] << { name: sub_category.name } 
     end 
    end 
    end 

, 당신은 할 수 있습니다 :

{"name1"=>[{"subcategory1"=>...},{"subcategory2"=>...}],"name2"=>[]} 

이 시도 : 각 키의 하위 범주의 배열을 저장해야

cat = Category.includes(:sub_categories).where(status: true).order(:id) 

그리고 추한 컨트롤러에서 SQL 쿼리를 제거하십시오.

은 다시 반복해야합니다보기를 렌더링하기 위해만큼 당신이 배열의 해시를 가지고

편집 : 노력하고 내가 % <`뷰에서 다음과 같이 사용

@categories.each do |category, values| 
    values.each do |sub_category| 
    subcategory["what you need"] 
    end 
end 
+0

@ categories.each do | category, sub_category | %>''% '를 보여줄 수는 있지만 sub_category를 보는 방법 sub_category.name을 시도했지만 오류가 – overflow

+0

일 때 두 개의 해시가 있기 때문에 객체가 아닙니다. 솔루션 추가 중. – tebayoso