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ção | Tipo | Descrição |
|---|---|---|
label | Boolean | Exibe ou não os labels dos campos |
submit_on_change | Boolean | Submete o filtro ao alterar qualquer campo |
submit_on_input | Boolean | Submete ao digitar (em campos de texto) |
styles | Hash | Estilização personalizada |
backend_if | String | Condição Ruby executada no backend (model, object, etc.) |
render_if | String | Condição JS que evita renderizar o campo no frontend |
show_if | String | Condiçã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.
🔍 Busca full-text com search
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
indexpara aplicar:
Model.full_text_search(params[:filters][:search])
⚠️ Atenção:
- Ao adicionar
keywords:em modelos que já possuem dados, será necessário darupdatenos registros existentes para que_keywordsseja 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:
statuscategorycitystatus, categorystatus, citycategory, citystatus, 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_indexesna 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. 🚀