Почему мышление сфинкса ограничивает фильтрацию одним атрибутом в ruby ​​на рельсах? - PullRequest
0 голосов
/ 29 января 2012

Я что-то не так делаю?

  1. Если у меня нет с опциями добавления местоположения, работает, и я получаю результаты, как только я захожу на страницу браузера моего сайта.

  2. Когда я нажимаю на страницу, все пользователи отображаются по 20 на страницу. Если я добавлю with_all пол => параметры [: пол], местоположение все еще работает, и я печатаю местоположение и фильтрую результаты по полу, и результаты успешно возвращаются.

  3. Если я добавлю этническую принадлежность к хешу with_all, этническая принадлежность сработает, и результаты поменяются, но пол и местоположение больше не будут работать.

Это как бы разрешает только 1 атрибут для фильтрации.

Я несколько раз перестраивал индекс, поэтому не понимаю, что происходит.

У меня есть текстовый поиск местоположения и 2 фильтра: 1. пол, 2. этническая принадлежность

Вот моя модель профиля для таблицы профилей, в которой хранятся все вышеперечисленные атрибуты:

  define_index do

    indexes location
        has ethnicity, :type => :integer
        has gender, :type => :integer

  end

Вот мой контроллер:

 class BrowsersController < ApplicationController
  def index
    @default_image = "/assets/default_avatar.jpg"
    #gender = params[:gender].to_i
    @users = Profile.search params[:location], 
                                   :page => params[:page], 
                                   :per_page => 20,
                                   :with_all => 
                                                { 
                                   :gender => params[:gender], 
                                   :ethnicity => params[:ethnicity] 
                                                }

  end
end

Форма просмотра:

<%= form_tag browsers_path, :method => 'get' do %>
  <p>
    Location: <%= text_field_tag :location, params[:location] %><br />
    Gender: <%= select_tag :gender, 
               options_for_select([["Select", nil], 
                  ["Male", 1], 
                 ["Female", 2]], params[:gender]) %>
<br />
    Ethnicity: <%= select_tag :ethnicity, 
               options_for_select([["Select", nil],['Black', 1 ],['White / Caucasian', 2 ],['European', 3 ],['Asian', 4 ],['Indian', 5 ],['Middle Eastern', 6 ],['Native American', 7 ],['Hispanic', 8 ],['Mixed Race', 9 ],['Other Ethnicity', 10 ]], params[:ethnicity]) %>
<br />
    <%= submit_tag "Search", :name => nil %>
  </p>
  <% end %>

1 Ответ

3 голосов
/ 29 января 2012

В вашем вопросе есть много чего переварить, но вот несколько вещей, на которые следует обратить внимание - возможно, они помогут:

:with_all - для сопоставления нескольких значений в одном атрибуте с несколькими значениями - например,соответствие статьи, в которой есть все три идентификатора тега, будет использовать это: :with_all => {:tag_ids => [1, 2, 3]}.

:with, однако, это прекрасно для того, чтобы иметь фильтры для более чем одного атрибута - что, как вам кажется, следует (хотя: with_all со значениями одного фильтра ведет себя точно так же)выполняется поиск профилей с данным полом и этнической принадлежностью 0. Возможно, попробуйте что-то вроде этого:

filters = {}
filters[:gender]    = params[:gender].to_i    if params[:gender].present?
filters[:ethnicity] = params[:ethnicity].to_i if params[:ethnicity].present?

@users = Profile.search params[:location], 
  :page     => params[:page], 
  :per_page => 20,
  :with     => filters

Наконец - столбцы пола и этнической принадлежности целые, да?Если это так, вам не нужно указывать :type => :integer в своем определении индекса - это будет сделано автоматически.

...