activerecord-hackery--ransack/docs/docs/going-further/saving-queries.md

2.4 KiB
Raw Blame History

sidebar_position title
7 Saving queries

Ransack Memory Gem

The Ransack Memory gem accomplishes this.

Custom solution

If you want a custom solution, you can build it yourself. My ransack AJAX searching doesnt save your search parameters across transactions. In this post Ill show you how to easily add this capability in a generic way.

In this example I added AJAX search ability to index pages.

def index
  @search = ComponentDefinition.search(search_params)
  # make name the default sort column
  @search.sorts = 'name' if @search.sorts.empty?
  @component_definitions = @search.result().page(params[:page])
end

I added methods(search_params, clear_search_index) in the ApplicationController to add a level of abstraction from the search gem I was using. Turns out this made things super easy, especially considering I wont have to update my code generation tools for index pages.

class ApplicationController < ActionController::Base
  def search_params
    params[:q]
  end
  def clear_search_index
    if params[:search_cancel]
      params.delete(:search_cancel)
      if(!search_params.nil?)
        search_params.each do |key, param|
          search_params[key] = nil
        end
      end
    end
  end
end

I decided to store the ransack search parameters, params[:q], in the session. To make the session parameter unique I used a key creed from the controllers name and “_search”.

class ApplicationController < ActionController::Base

  # CHECK THE SESSION FOR SEARCH PARAMETERS IS THEY AREN'T IN THE REQUEST
  def search_params
    if params[:q] == nil
        params[:q] = session[search_key]
    end
    if params[:q]
          session[search_key] = params[:q]
        end
        params[:q]
  end
  # DELETE SEARCH PARAMETERS FROM THE SESSION
  def clear_search_index
      if params[:search_cancel]
        params.delete(:search_cancel)
        if(!search_params.nil?)
            search_params.each do |key, param|
                search_params[key] = nil
            end
        end
        # REMOVE FROM SESSION
        session.delete(search_key)
      end
  end

protected
  # GENERATE A GENERIC SESSION KEY BASED ON TEH CONTROLLER NAME
  def search_key
    "#{controller_name}_search".to_sym
  end
end

Based on Saving queries