Reputation: 1829
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
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