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

83 lines
2.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
sidebar_position: 7
title: Saving queries
---
## Ransack Memory Gem
The [Ransack Memory](https://github.com/richardrails/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.
```ruby
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.
```ruby
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”.
```ruby
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](https://techbrownbags.wordpress.com/2015/02/18/rails-save-ransack-search-queries/)