xps15z
xps15z

Reputation: 1829

Creating advanced search options

With using the thinking sphinx gem does someone know how to setup an advanced search form?

I have the single search form query working, however I also have the option for users to select options from a advance search box.

Here's the normal, standard one line search box code that works:

        = form_tag searches_path, method: :get do
          span.secrch_box_bg
            input.text_input name='search' type="text" placeholder="e.g (female), likes dogs, has a job)"
            input.find_btn type="submit" value="Find" /

What I would like to do is offer pre select options from a drop down menu. Users can select the gender (male or female), ethnicity (white, black, asian, hispanic, etc), religion (christian, atheist, jewish, etc), and other attributes found in the Users table.

Can someone provide an example of how to do this? Thanks

I'm getting rid of my custom advanced search form and I wanted to use Thinking Sphinx in its place.

                 .search_box
        h1 Search and find a mate.
        = form_tag searches_path, method: :get do
          span.secrch_box_bg
            input.text_input name='search' type="text" placeholder="e.g (female), likes dogs, has a job)"
            input.find_btn type="submit" value="Find" /
      h4
        | or use our
        a.adv_search href="#" 
          = image_tag "adv_link.png"
          span Advanced Search
      .advanced_search_div.hide
      = form_tag searches_path, method: :get do
          .form_container
            .row style='padding-top:20px;'
              .col
                label I am a
                select.large
                  option male
                  option female
              .select2
                .col.col2 style='width:300px;'
                  label Seeking
                  select.large
                    option female
                    option male
              .select1
                .col.col3.col33 style='width:175px;'
                  label Ages
                  = select_tag :min_age, options_for_select((18..65),18), {class: 'small'}

              .select5
                .col.col4
                  label to
                  = select_tag :max_age, options_for_select((20..65),65), {class: 'small'}

              .select4
                .col.col7 style='margin-left: 10px;width:233px;'
                = select_tag :ethnicity, options_for_select(['Asian', 'Black', 'Biracial', 'Indian', 'Hispanic/Latin', 'Middle Eastern', 'Native American', 'Pacific Islander', 'White', 'Other']), prompt: 'ethnicity/race'

            .row style='padding-top:20px;'
              .col.col5 style='margin-right:18px;'
                label Near
                = text_field_tag :zip_code, nil, placeholder: "enter zip here", class: 'text_input'

              .col.col.col30 style='width:190px;'
                = select_tag :children, options_for_select(['I want kids now','I want one someday']), prompt: 'child preference'

              .select5
                .col.col3.col31 style='width:100px;'
                  = select_tag :religion, options_for_select(['Agnostic', 'Atheist', 'Christian', 'Catholic', 'Buddhist', 'Hindu', 'Jewish', 'Muslim', 'Other']), prompt: 'religion'
            .btm_sec style='margin-top:20px;'
              ul.form_list
                li
                  a href="#" 
                    = image_tag "form_icon1.png"
                    span.color Save this Search
                li
                  a href="#" 
                    = image_tag "form_icon2.png"
                    span Load
                li
                  a href="#" 
                    = image_tag "form_icon3.png"
                    span Reset
              input.find_btn type="submit" value="Find" /
          .btm_search_detail
            a.simple_search href="#" 
              = image_tag  "simple_search_icon.png" 
              span Simple Search

Index:

ThinkingSphinx::Index.define :location, :with => :active_record do 
  indexes city 

  has "RADIANS(locations.latitude)",  :as => :latitude,  :type => :float
  has "RADIANS(locations.longitude)", :as => :longitude, :type => :float
end 

ThinkingSphinx::Index.define :user, :with => :active_record do 
  indexes name, :as => :user, :sortable => true 
  indexes religion, birthday, about_me, height, career, feet, inches, sexuality, children, user_smoke, user_drink, politics, gender, ethnicity, education, username
  has created_at, updated_at 
  has "RADIANS(locations.latitude)",  :as => :latitude,  :type => :float
  has "RADIANS(locations.longitude)", :as => :longitude, :type => :float
  has(:id, :as => :user_id)
  has(:zip_code, :as => :zip_code, :type => :integer)
  set_property :wordforms => 'lib/word.txt'
  join location
end 

Upvotes: 1

Views: 263

Answers (1)

TomDavies
TomDavies

Reputation: 672

You can setup your form however you like. The key is you need to then convert your form parameters into a search options Hash to pass to ThinkingSphinx.

For example, for indexes you will specify conditions:

User.search(query, :conditions => { :ethnicity => params[:ethnicity], :religion => params[:religion] })

For the 'has' attributes you would specify :with as the search option. Also, you should probably add age as a 'has' attribute so you can use Sphinx to do the max computation like so:

User.search(query, :with => { :age => 20..65 })

See also: http://pat.github.io/thinking-sphinx/searching.html

Upvotes: 1

Related Questions