Recent search history with Kredis
Why use Redis? Hitting kredis is much cheaper than hitting a relational database. By storing high-frequency data on Redis we save resources.
Wtf Kredis? Kredis makes using Redis easier in Rails, and most importantly helps to associate Redis object with Rails Models.
Previously I wrote about “Recently visited pages with Kredis”
“Recent search history” is a very similar feature in terms of implementation.
Feature description:
- whenever a user submits a search form, the search query is saved in redis
- display the users last 5 search queries
Prerequisites:
- scaffold
Posts title:string
- Authentication,
current_user
Implementation:
First, associate a Redis entity of kredis_unique_list
with the user.rb
model:
# app/models/user.rb
class User < ApplicationRecord
kredis_unique_list :recent_searches, limit: 5
end
Add a search form:
# app/views/posts/index.html.erb
<%= form_with url: posts_path do |form| %>
<%= form.text_field :query %>
<%= form.submit %>
<% end %>
When there search form is submitted, save the search params to current_user.recent_searches
. prepend
will add it at the top of the list:
# app/controllers/posts_controller.rb
def index
@posts = if params[:query].present?
Post.where(name: params[:query])
current_user.recent_searches.prepend(params[:query]) if params[:query].present?
else
Post.all
end
end
Display a list of clickable recent searches:
# app/views/users/_recently_searches.html.erb
<% current_user.recent_searches.elements.each do |query| %>
<%= link_to query, posts_path(query:) %>
<% end %>
That’s it!
Did you like this article? Did it save you some time?