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.