0

ファセットについてはまだ学習中ですが、関連付けられたレコードが割り当てられていないレコードをフィルター処理したいと考えています。最初のいくつかのコード:

モデル:

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>

ビューには、それぞれのカウントを含むカテゴリ フィルターのリストが表示されますが、カテゴリが割り当てられていないプロジェクトをクエリする「未割り当て」ファセット(およびそのカウント)を含めたいと考えています。これはファセットで可能ですか?また、任意のカテゴリが割り当てられたプロジェクトをフィルタリングする "Assigned any" ファセット (およびそのカウント) はどうですか? ありがとうございました。

4

1 に答える 1

2

あなたがこの質問をしてからしばらく経ちました。しかし、私は最近、rails/sunspot/solr を使用していて、あなたの質問に出くわしました。うまくいけば、あなたはあなたの答えを見つけましたが、そうでない場合は、私がそれを行う方法は次のとおりです.

ファセットは、現在の検索結果を分類する方法です。「割り当てられていない」ファセットを実装する 1 つの方法は、実際にそれを使用してオブジェクトにインデックスを付けることです。

プロジェクト モデルでは、次のように変更します。

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

row.instance.nameカテゴリ名を取得するためにビューで使用しているようです。:references検索可能な属性を文字列に切り替えたので (そして明らかな理由で、文字列値でandを使用することはできません!)、 type フィールドrow.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>
于 2012-07-04T00:35:17.383 に答える