Pular para o conteúdo principal

Filters

O bloco filters define os campos utilizados para busca e filtragem de registros nas telas index dos controladores relacionados aos modelos. Ele melhora a experiência do usuário, acelera o acesso à informação e gera índices automáticos no MongoDB para aumentar a performance.


🔧 Estrutura básica

Todo bloco de filtros deve começar com:

filters :name do
end

Você pode ter múltiplos conjuntos de filtros com nomes diferentes para exibir em listas específicas. E limitar onde eles vão aparecer usando as condicionais como o backend_if. Por exemplo:

filters :filter_x, backend_if: "params[:controller] == 'admin/customers'" do
end
filters :filter_y, backend_if: "params[:controller] == 'public/customers'" do
end

⚙️ Opções do bloco filters

OpçãoTipoDescrição
labelBooleanExibe ou não os labels dos campos
submit_on_changeBooleanSubmete o filtro ao alterar qualquer campo
submit_on_inputBooleanSubmete ao digitar (em campos de texto)
stylesHashEstilização personalizada
backend_ifStringCondição Ruby executada no backend (model, object, etc.)
render_ifStringCondição JS que evita renderizar o campo no frontend
show_ifStringCondição JS que apenas oculta visualmente

➕ Adicionando filtros com add

Você pode adicionar filtros reutilizando a definição de um field já existente no modelo:

filters :default do
add :category, type: :select, inclusion: %w[option1 option2 option3]
end

Se o nome passado em add corresponder a um campo existente, ele herdará o tipo, máscara, e todas as opções automaticamente.

Se não existir um campo com esse nome, o filtro deve ser montado como um componente, passando:

add :input_name, type: :input, input_type: :text

Para detalhes completos sobre o que pode ser sobrescrito em um filtro. Além disso as opções que podem ser passada para um add também são as mesmas de um field. Acesse a seção de Fields para mais conhecer todas as opções.


O tipo especial :search permite adicionar um campo de busca fulltext, mapeando palavras-chave de múltiplos campos e métodos.

Exemplo:

add :search, type: :search, keywords: %w[name email]

Esse filtro cria um campo search e popula automaticamente o campo oculto _keywords do modelo, com base nas palavras extraídas durante create ou update.

O Nerdify usa esse campo automaticamente na action index para aplicar:

Model.full_text_search(params[:filters][:search])

⚠️ Atenção:

  • Ao adicionar keywords: em modelos que já possuem dados, será necessário dar update nos registros existentes para que _keywords seja atualizado.
  • Você pode inspecionar isso no console:
Customer.first._keywords
Customer.full_text_search("Jhon")

⚡ Índices no MongoDB

Ao definir filtros no Nerdify, o sistema gera os índices automaticamente com base nas combinações possíveis entre os filtros.

Por exemplo, com os campos:

add :status
add :category
add :city

O Mongoid/Nerdify vai gerar índices para:

  • status
  • category
  • city
  • status, category
  • status, city
  • category, city
  • status, category, city

Esses índices serão criados automaticamente quando você executar o comando:

rails db:mongoid:create_indexes

🧠 Isso garante consultas rápidas mesmo com múltiplos filtros, sem que você precise se preocupar com a criação manual de índices no MongoDB. É interessante colocar o comando rails db:mongoid:create_indexes na pipeline de deploy da aplicação.


Com os filters, o Nerdify oferece uma interface poderosa e performática de busca, conectada diretamente aos modelos e integrada com otimizações no banco de dados. 🚀