Problemas técnicos 1/8: Buscador en múltiples modelos

SearchKick en Ruby on Rails

Joao Sillas — Unsplash.com

Buscador de múltiples Modelos

A veces es necesario buscar información o recursos en diferentes modulos, es decir, poder buscar Usuarios, Posts, Eventos, Productos, etc.

Para esto necesitamos una gema que se llama: Searchkick.

¿Cómo funciona Searchkick?

1- Lo primero que tenemos que hacer es instalar Elasticsearch:

brew install elasticsearch

2- Instalar la gema en GemFile

gem 'searchkick'

3.- Incluirlo en los modelos que quieres que busque información:
(app/models/user.rb)(app/models/product.rb)(app/models/event.rb)

class User < ActiveRecord::Base
searchkick
end
--------
class Product < ActiveRecord::Base
searchkick
end
--------
class Event < ActiveRecord::Base
searchkick
end
--------

4- Si ya hay registros, hay que ingresar a la consola y reindexar los modelos, esto se hace así:

rails console
User.reindex
Product.reindex
Event.reindex

5.- Lo siguiente es crear un controlador con una acción Search donde pondremos toda la lógica de la búsqueda.

rails g controller Search search

6.- Ahora hay que crear las rutas necesarias para que nuestro buscador pueda funcionar (app/config/routes.rb).

get 'search', to: 'search#search'

Lo que hicimos fue especificar que la búsqueda la vamos a realizar en el controlador Search, en la acción Search (search#search).

7.- Ahora bien, dentro del controlador hay que especificar qué hacer cuando se tiene información en la búsqueda y también cuando no se tiene.
(app/controllers/search.controller.rb)

class SearchController < ApplicationController
def search
if params[:search].nil?
@users = []
@products = []
@events = []
else
@users = User.search params[:search]
@products = Product.search params[:search]
@events = Event.search params[:search]
end
end
end

Lo que hicimos fue decir que cuando los parámetros de la búsqueda esté vacío, no muestre ningún resultado, pero que si los parámetros de la búsqueda tiene información, busque en los modelos todos los registros que contengan algo de esos parámetros.

8.- Ahora tenemos que crear nuestro formulario donde pediremos los parámetros necesarios para que pueda ir a buscar a nuestro controlador y especifiquemos en donde visualizar los resultados.

<%= form_tag search_path, method: :get, role: "search" do %>
<%= text_field_tag :search, params[:search]%>
<%= submit_tag "Search", name: nil%>
<% end %>

9.- Por último en nuestras vistas de la búsqueda tenemos que especificar cómo vamos a visualizar los resultados. Es importante que muestre los resultados únicamente cuando haya información, de otra manera no muestre nada. (app/views/search/search.html.erb)

<% if @nomads.present? %>
<h3>Users</h3>
<% @users.each do |user| %>
<%= user.name %>
<% end %>
<% end %>
<% if @products.present? %>
<h3>Products</h3>
<% @products.each do |product| %>
<%= product.name %>
<% end %>
<% end %>
<% if @events.present? %>
<h3>Events</h3>
<% @events.each do |event| %>
<%= event.name %>
<% end %>
<% end %>

Está todo listo para hacer búsquedas. Es importante decir que se tienen que hacer configuraciones especiales si se quiere utilizar en «Producción». En caso de estar utilizando heroku, lo que tenemos que hacer es instalar Bonsai para poder utilizar SearchKick.

heroku addons:create bonsai
heroku config:set ELASTICSEARCH_URL=`heroku config:get BONSAI_URL`