Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Save search options from advanced search form

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
like image 802
Cornelius Wilson Avatar asked Oct 20 '22 03:10

Cornelius Wilson


1 Answers

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.

like image 124
olive_tree Avatar answered Oct 22 '22 22:10

olive_tree