I have a advanced search form and I would like to present the users a option to save their options. How can I accomplish this?
The user should be able to fill out their options for the advanced search form, and click "Save this Search" link which will store their options. With this in place each user will have their custom default search options so each time they visit they won't have to reenter the details.
I think this would be helpful to a lot of people in the future.
Searches controller:
def new
@search = Search.new
render layout: 'new_application'
end
def create
@search = Search.new(params[:search])
if @search.save
redirect_to @search
else
render 'new'
end
end
def show
@user = current_user
@search = Search.find(params[:id])
@users = @search.users
render 'users/index', layout: 'new_application'
end
def update
@search = Search.find(params[:id])
if @search.update_attributes(params[:search])
redirect_to @search
else
render 'new'
end
end
def index
if location = Location.find_by_zipcode(params[:search])
latitude = location.latitude * Math::PI / 180
longitude = location.longitude * Math::PI / 180
locations = Location.search(
:geo => [latitude, longitude],
:with => {:geodist => 0.0..600_000.0},
:order => 'geodist ASC',
:per_page => 5_000
)
@users = User.where(zip_code: locations.map(&:zipcode))
else
@users = User.search(params[:search])
end
end
def min_age
@min_age = params[:min_age].to_i.years
end
def max_age
@max_age = params[:max_age].to_i.years
end
def youngest_age
@youngest_age = params[:youngest_age].years
end
def oldest_age
@oldest_age = params[:oldest_age].years
end
end
Search model:
def users
@users ||= find_users
end
private
def find_users
users = User.order(:id)
users = users.where(gender: gender) if gender.present?
users = users.where(zip_code: zip_code) if zip_code.present?
users = users.where(children: children) if children.present?
users = users.where(religion: religion) if religion.present?
users = users.where(ethnicity: ethnicity) if ethnicity.present?
if min_age.present? && max_age.present?
min = [ min_age, max_age ].min
max = [ min_age, max_age ].max
min_date = Date.today - min.years
max_date = Date.today - max.years
users = users.where("birthday BETWEEN ? AND ?", max_date, min_date)
users
end
users
end
end
Search form:
a.adv_search href="#"
= image_tag "adv_link.png"
span Advanced Search
= form_for @search do |f|
.form_container
.row
.col
label I am a
select.large
option Female
option Male
.select2
.col.col2
label Seeking
= f.select :gender, %w(Female Male)
.select1
.col.col3
label Ages
= f.select :min_age, options_for_select((18..50),25), {}, {class: 'small'}
.select5
.col.col4
label to
= f.select :max_age, options_for_select((20..50),45), {}, {class: 'small'}
.row
.col.col5
label Near
= f.text_field :zip_code,placeholder: "enter zip here", class: 'text_input'
.col.col6
= f.select :children, ['I want kids now','I want one someday'], prompt: 'child preference'
.select4
.col.col6
= f.select :religion, ['Agnostic', 'Atheist', 'Christian', 'Catholic', 'Buddhist', 'Hindu', 'Jewish', 'Muslim', 'Spiritual without affiliation', 'Other', 'None', 'Prefer not to say'], prompt: 'Religion'
.select4
.col.col7
= f.select :ethnicity, ['Asian', 'Biracial', 'Indian', 'Hispanic/Latin', 'Middle Eastern', 'Native American', 'Pacific Islander', 'White', 'Other'], prompt: 'Ethnicity'
.btm_sec
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
If you don't want to have to store them in a model, the best thing is to store in a serialized hash. I've done this for an app where I needed admins to save their preferences/settings. I've tried acouple gems, in the end I used rails-settings.
Ie, in your User model, you'd do something like:
class User < ActiveRecord::Base
has_settings do |s|
s.key :search_options, :defaults => { :gender => 'male'}
end
end
Then to set/save settings, you can do:
user.settings(:search_options).gender = 'female'
user.save!
What I like about this approach is that it has a low foot-print, and if you ever start seeing scalability issues, then its very easy to strip it out and implement a full model for optimization.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With