LIKE em vários atributos no Rails

Dicas - 31/Mai/2020 - por Henrique Morato

Durante o desenvolvimento em Rails, precisamos fazer buscas mais complexas em vários atributos. O Rails nos permite simplificar essa tarefa utilizando o método scope, deixando a classe mais limpa. Mas, com o tempo, a busca pode ficar algo semelhante ao código abaixo:

class User < ApplicationRecord

  scope :search, -> (query) { 
    where('first_name LIKE :search OR last_name LIKE :search OR email LIKE :search OR cpf LIKE :search', search: "%#{query}%")
  } 

end

Toda essa string poderia ser gerada dinamicamente da seguinte forma:

class User < ApplicationRecord

  scope :search, -> (query) { 
    text = "%#{query}%"
    search_columns = %w[first_name last_name email cpf]
    where(
      search_columns
        .map { |field| "#{field} ILIKE :search" }
        .join(' OR '),
      search: text
    )
  }

end

Esse código pode ser simplificado usando menos variáveis, aqui optamos por uma alternativa menos otimizada, porém de fácil compreensão. Também é possível salvar as colunas que podem ser buscadas em uma constante facilitando uma nova inclusão futura.

É claro que gems como pg_search ou scoped_search também podem facilitar o trabalho.

Foto de perfil do autor
Henrique Morato

Dev