Как искать более одного варианта в Sunspot? - PullRequest
2 голосов
/ 30 марта 2012

Используя Sunspot , у меня есть следующие настройки:

Форма поиска

<div>
Search field
<%= text_field_tag :search, params[:search] %>

Online
<%= check_box_tag :online_search, 'online_search_value', 
                                   params[:online_search_checked] %>

Street Address
<%= text_field_tag :location, params[:search_loc] %>
</div>

Поиск контроллера

class SearchController < ApplicationController

  def index
    params[:online_search_checked] = true 
    restore_cookie 
  end

  def results
    update_cookie 
    restore_cookie 
    @search = Product.search do |q| 
      q.fulltext params[:search] unless params[:search].blank?

      # Text field to search an address.
      q.with(:location).near(params[:search_loc]) 
                       if params[:search_loc].present?

      # Checkbox thats already checked off to search online.
      # If it's un-checked It will not search online.
      q.with(:online_search, false) if params[:online_search].nil?

    end
    @products = @search.results 
  end

  def update_cookie 
    update_cookie_with_param(:online_search, :online_search_checked)
  end

  def restore_cookie 
    restore_param_from_cookie(:online_search_checked)
  end

  def update_cookie_with_param(value_param_name, checked_param_name)
    checked = params[value_param_name].nil? ? "false" : "true"
    cookies[checked_param_name] = { :value => 
                                checked, :expires => 2.weeks.from_now } 
  end

  def restore_param_from_cookie(checked_param_name)
    if cookies[checked_param_name] 
      params[checked_param_name] = (cookies[checked_param_name] == "true")
    end
  end
end

При поиске :location я хочу, чтобы он включал :online_search, если пользователь не снимает флажок.Вот что делает эта строка:

q.with(:online_search, false) if params[:online_search].nil?

Теперь, чтобы включить ее в поиск :location.Как мне поступить с Sunspot?

1 Ответ

1 голос
/ 02 апреля 2012

: online_search - это символ, он никогда не будет нулевым.

Однако, если вы хотите, чтобы params [: online_search] был пропущен, если его ноль, вы можете попробовать что-то вроде этого:

q.with( *[params[:online_search], false].compact) 

* превращает ваш массив в параметры и компактный удаляетлюбые нулевые значения, удаляя params [: online_search], если он пуст.

Таким образом, вы получите

q.with(false) # when params[:online_search] was empty

и

q.with('some value, false) # when params[:online_search] has data
...