ruby-on-rails – 同时选择多个方面或过滤数据
更新于6/29/12
我设法建立了一个搜索和一个侧栏,用于使用Sunspot过滤搜索结果,并使用Rails进行行为标记.我正在学习本教程here 我原来的问题是这样的:
以下是我的代码: 齿轮控制器 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,:color text :user_firstname do user.firstname end text :user_lastname do user.lastname end # **Facet Section** string :size,: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 解决方法
看起来您需要利用:排除选项进行分面搜索.
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,:name => :all_categories paginate(page: params[:page]) end @hits = @search.results end 所以我上面所做的是创建一个排除数组来保存过滤器集合. with()方法返回一个过滤器对象,因此我们捕获了排除数组中的所有过滤器.我们做紧凑!从数组中删除nil对象,如果它是空的,我们将其设为nil(这是由于:exclude选项的限制,如果你传递一个空数组,它将无法正常工作).然后,我们将使用相同的:sub_category_name术语,不包括过滤器,并为其命名.此方面将为您提供除所选项之外的所有方面类别. 然后在您的视图中,当您显示构面选项时,使用命名: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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |