2012-03-30 1 views
2

Используя Sunspot, у меня есть следующие настройки:Как найти несколько вариантов в 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?

+0

Я считаю, что бесконтрольно флажок не будет передан в ваш Params, если он не установлен. Я бы подумал, что просто выполнение 'if params [: online_search]' и т. Д. Будет работать нормально. – John

+0

@johnernaut Я не совсем понимаю, что вы имеете в виду. Вы также можете сделать этот ответ, если хотите. – LearningRoR

+1

'params [: online_search]' не должен быть отправлен, если он не был проверен. Попробуйте просто выполнить 'if params [: online_search] ... q.with (: online_search) ... end'. Дайте мне знать, если это сработает, и я отвечу. – John

ответ

1

: 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 
+0

Что делает '.compact'? – LearningRoR

+1

, если у вас есть массив с нулевыми значениями в нем, он удаляет их: [1, nil, 2, nil, 3, nil, nil, 5] => [1,2,3,5] –

+0

Кажется, ничего не изменится после играя с ним. Может быть, это имеет какое-то отношение к моей «cookie» в отношении 'online_search'? Я отредактировал мой вопрос и дал ему более подробную информацию. – LearningRoR

Смежные вопросы