2011-11-08 11 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

この質問をしてからしばらくお待ちしております。しかし、最近私はレール/太陽黒点/ソルで作業していて、あなたの質問に遭遇しました。うまくいけばあなたの答えを見つけましたが、もしそうでなければ、私はそれをやるでしょう。

ファセットは、現在の検索結果を分類する方法です。割り当てられていないファセットを実装する方法の1つは、オブジェクトを実際にインデックスすることです。あなたのプロジェクトモデルで

、私はそれを変更します:私はあなたがカテゴリ名を取得するためにビューに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> 
関連する問題