4

2012 年 6 月 29 日更新

Sunspot を使用して検索結果をフィルタリングし、Rails でタグ付け可能として機能するための検索とサイドバーを設定することができました。このチュートリアルhereに従っていまし たが、一度に複数のフィルターを選択することはできません。フィルタを選択すると、他のサブカテゴリ名が消えます。私は何が欠けていますか?

私の最初の質問はこれでした:

一度に複数のファセットを選択してデータをフィルタリングする方法がよくわかりません。したがって、複数のサブカテゴリ (ハイキング、スキー、クライミングなど) があります。ハイキングとクライミングを同時に選択できるようにしたいので、表示されるデータはハイキングとクライミングのオブジェクトのみです。今、私は 1 つ (ハイキングとしましょう) を選択すると、他のすべてのオプションが消えます。誰か説明できますか?

以下は私のコードです:

ギアコントローラー

  def index
    @search = Gear.solr_search do
        exclusions = []
        fulltext params[:search]
        exclusions << with(:sub_category_name, params[:name]) if params[:name].present?
        exclusions.compact!
        exclusions = nil if exclusions.empty?
        facet :sub_category_name
        facet :sub_category_name, :exclude => exclusions, :name => :all_categories
        paginate(page: params[:page], :per_page => 15)
    end

    @gears = @search.results
  end 

**ギアインデックスビュー**

<div class="gears_container">
    <div class="side_bar_search">
        <%= form_tag gears_path, :method => :get do %>
          <p>
            <%= text_field_tag :keywords, params[:keywords] , class: 'gearsearchbar' %> <%= submit_tag "Search", :name => nil, class: 'btn btn-inverse gearsearchbutton'  %>

         </p>
        <% end %>

    <div class="sidebar_section">Sub Category</div>
    <ul>
    <% for row in @search.facet(:all_categories).rows %>
      <li class="sidebar_options">
        <% if params[:name].present? %>
          <strong><%= row.value %></strong>(<%= link_to "remove", :name => nil %>)
        <% else %>
          <%= link_to row.value, :name => row.value %> (<%= row.count %>)
        <% end %>
      </li>
    <% end %>
    </ul>
</div>
<div c
    <div class="search_results_gear">   
        <% @hits.each do |gear| %>
            <%= render partial: 'gear', locals: {gear: gear} %>
        <% end %>
        <div style="clear:both"></div>
     <%= will_paginate @hits, class: 'flickr_pagination' %>
         </br>
    </div>
</div>

ギアモデル

class Gear < ActiveRecord::Base
  attr_accessible :title, :size, :price, :sub_category_id, :user_id, :image, :image_a, :remote_image_url, :color, :year, :latefee, :cancellation, :minrental, :policy, :about, :address, :city, :state, :zip, :sub_category_name
  belongs_to :user
  belongs_to :sub_category
  has_one :category, :through => :sub_category
  has_many :comments, :dependent => :destroy 
  has_many :line_items
  require 'carrierwave/orm/activerecord'
  mount_uploader :image, GearpicUploader
  mount_uploader :image_a, GearpicUploader
  before_destroy :ensure_not_referenced_by_any_line_item
  acts_as_taggable_on :tags

  validates :title, presence: true
  validates :size,  presence: true
  validates :price, presence: true
  validates :sub_category_id, presence: true
  validates :user_id, presence: true

  searchable do
     text :title, :size, :price, :year, :zip, :state, :city, :minrental, :about, :latefee, :color

     text :user_firstname do
          user.firstname
     end

     text :user_lastname do
          user.lastname
     end
     # **Facet Section**   

     string :size, :price, :year, :zip, :state, :city, :minrental, :latefee, :color 

     string :sub_category_name , :multiple => true, :stored => true do
       sub_category.name
     end

     string :category_name do
       category.name
     end
   end

   private
   def ensure_not_referenced_by_any_line_item
     if line_items.empty?
      return true
      else
      errors.add(:base, 'Line Items present')
      return false
     end
   end

end
4

1 に答える 1

3

:excludeファセット検索のオプションを利用する必要があるようです。

def index
  @search = Gear.search do
    exclusions = []
    # tags, AND'd        
    if params[:tag].present?
      all_of do
        params[:tag].each do |tag|
          exclusions << with(:sub_category_name, tag)
        end
      end
    end
    exclusions.compact!
    exclusions = nil if exclusions.empty?
    facet :sub_category_name
    facet :sub_category_name, :exclude => exclusions, :name => :all_categories
    paginate(page: params[:page])
  end
  @hits = @search.results
end

上記で行ったことはexclusions、フィルターのコレクションを保持する配列を作成することです。このwith()メソッドはフィルター オブジェクトを返すため、exclusions配列内のすべてのフィルターをキャプチャします。配列から nil オブジェクトを削除し、compact!空の場合は作成しますnil(これは:excludeオプションの制限によるもので、空の配列を渡すと正しく機能しません)。次に、フィルターを除いfacetて同じ用語を使用し、名前も付けます。:sub_category_nameこれによりfacet、選択したものを除くすべてのファセット カテゴリが表示されます。

次に、ビューでファセット オプションを表示するときに、名前付き:all_categoriesファセットを使用します。

@search.facet(:all_categories).rows.each_with_index do |facet, index|
  # This just outputs all the facets, you can add the logic in.
  <li><%= facet.value %> (<%= facet.count %>)</li>
end
于 2012-06-29T19:05:00.270 に答える