LondonGuy
LondonGuy

Reputation: 11098

Why is thinking sphinx restricting filtering to one attribute at a time in ruby on rails?

Am I doing something wrong?

  1. If I don't have the with options added location works and I get results shown as soon as I enter the browser page of my website.

  2. When i hit the page all users are shown by 20 per page. If I add with_all gender => params[:gender], location still works and I type in a location and filter results by gender and results are successfully returned.

  3. If I add ethnicity to the with_all hash then ethnicity works and results are turned but gender and location no longer work.

It's like it only allows 1 attribute for filtering.

I have rebuilt the index several times so I don't get what's going on.

I've got text search for location and 2 filters set 1. gender, 2. ethnicity

Here is my Profile model for the profiles table that stores all the attributes above:

  define_index do

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

  end

Here is my controller:

 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

my view form:

<%= 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 %>

Upvotes: 0

Views: 593

Answers (1)

pat
pat

Reputation: 16226

There's a lot to digest in your question, but here's a few things to note - perhaps they will help:

:with_all is for matching multiple values in a single multi-value attribute - for example, matching an article that has all three tag ids would use this: :with_all => {:tag_ids => [1, 2, 3]}.

:with, however, is perfectly fine for having filters on more than one attribute - which is what you seem to be after (although :with_all with single filter values behaves in just the same way).

Sphinx treats nils/NULLs as 0's - so, if you're filtering by a gender but not an ethnicity, then what your controller code is doing is searching for profiles with the given gender and an ethnicity of 0. Perhaps try something like this instead:

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

Finally - the gender and ethnicity columns are integers, yes? If so, you don't need to specify :type => :integer in your index definition - that'll be done automatically.

Upvotes: 3

Related Questions