加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 同时选择多个方面或过滤数据

发布时间:2020-12-17 02:17:54 所属栏目:百科 来源:网络整理
导读:更新于6/29/12 我设法建立了一个搜索和一个侧栏,用于使用Sunspot过滤搜索结果,并使用Rails进行行为标记.我正在学习本教程here 但我仍然无法立即选择多重过滤器.当我选择过滤器时,其他子类别名称仍然会消失.我错过了什么? 我原来的问题是这样的: I’m not q
更新于6/29/12

我设法建立了一个搜索和一个侧栏,用于使用Sunspot过滤搜索结果,并使用Rails进行行为标记.我正在学习本教程here
但我仍然无法立即选择多重过滤器.当我选择过滤器时,其他子类别名称仍然会消失.我错过了什么?

我原来的问题是这样的:

I’m not quite sure how to select multiple facets at once filtering the
data. So I have multiple sub categories i.e.(hiking,skiing,climbing,
etc.) I want to be able to select hiking and climbing simultaneously
so the data shown is only those objects of hiking and climbing. Right
now I select one (let’s say hiking) and all the other options
disappear. Can someone explain?

以下是我的代码:

齿轮控制器

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读