2011-11-08 1 views
0

여전히 패싯에 대해 알지만 관련 레코드가 할당되지 않은 레코드를 필터링하고 싶습니다. 우선 몇 가지 코드 :Rails + Sunspot : 연관이 지정되지 않은 레코드를 필터링하기위한 "지정되지 않은"패싯?

모델 :

class Project < ActiveRecord::Base 
    belongs_to :category 

    searchable do 
    text :name 
    integer :category_id, :references => Category 
    end 
end 

컨트롤러 :

class ProjectsController < ApplicationController 
    def index 
    @search = Project.search do 
     fulltext params[:q] 
     facet :category_id 
     with(:category_id, params[:category_id]) if params[:category_id].present? 
    end 
    @projects = @search.results 
    respond_with(@projects) 
    end 

뷰 :

<ul> 
    <% for row in @search.facet(:category_id).rows %> 
    <li> 
     <% if params[:category_id].blank? %> 
     <%= link_to row.instance.name, :category_id => row.value %> (<%= row.count %>) 
     <% else %> 
     <strong><%= row.value %></strong> (<%= link_to "remove", :category_id => nil %>) 
     <% end %> 
    </li> 
    <% end %> 
</ul> 

뷰가 각각 카운트와 카테고리 필터의 목록을 보여줍니다 그러나 "할당되지 않은"패싯 (및 그 카운트)을 포함하고자합니다은 카테고리가 지정되지 않은 프로젝트를 쿼리합니다. 패싯이 가능합니까? 또한 카테고리가 할당 된 프로젝트를 필터링하는 "할당 된 모든"패싯 (및 해당 개수)은 어떻게됩니까? 고맙습니다.

+0

범프. 어떤 아이디어? – robertwbradford

답변

2

나는이 질문을 한 지 오래되었다고 알고 있습니다. 하지만 최근에 레일/태양 흑점/솔라로 일해 왔고 당신의 질문에 비틀 거렸다. 다행히도 당신은 당신의 답을 찾았습니다. 그렇지 않다면, 어떻게 할 수 있겠습니까?

패싯은 현재 검색 결과를 분류하는 방법입니다. 할당되지 않은 패싯을 구현하는 한 가지 방법은 실제로 개체를 인덱싱하는 것입니다. 난 당신이 범주의 이름을 가져보기에 row.instance.name을 사용하고 참조

class Project < ActiveRecord::Base 
    belongs_to :category 

    searchable do 
    text :name 
    string :category_name do 
     category_id.present? ? (category.name + "|" + category_id.to_s) : "Unassigned" 
    end 
    end 
end 

: 당신의 사업 모델에서

, 나는 그것으로 변경합니다. 검색 가능한 속성을 문자열로 전환 했으므로 (그리고 명백한 이유로 :referencesrow.instance을 문자열 값으로 사용할 수 없습니다!) category_name|category_id 유형 필드의 조합으로 필드를 색인화하도록 선택했습니다. Projectcategory_id이 없으면 "Unassigned" 문자열이 사용됩니다.

이제 검색 블록의 코드를 변경하여 변경 사항을 반영하거나 모델링합니다.

class ProjectsController < ApplicationController 
    def index 
    @search = Project.search do 
     fulltext params[:q] 
     facet :category_name 
     with(:category_name, params[:category_name]) if params[:category_name].present? 
    end 
    @projects = @search.results 
    respond_with(@projects) 
    end 

와 뷰 코드도 변경 :

<ul> 
    <% for row in @search.facet(:category_name).rows %> 
    <li> 
     <% if params[:category_name].blank? %> 
     <%= link_to (row.value.include? '|') ? row.value.split('|')[0] : row.value, :category_name => row.value %> (<%= row.count %>) 
     <% else %> 
     <strong><%= row.value %></strong> (<%= link_to "remove", :category_name => nil %>) 
     <% end %> 
    </li> 
    <% end %> 
</ul>