Skip to content

Adiciona gem ancestry para otimizar hierarquia de posts do fórum#57

Open
franciscojuliao-star wants to merge 15 commits intodevelopmentfrom
fix/forum-ancestry-performance
Open

Adiciona gem ancestry para otimizar hierarquia de posts do fórum#57
franciscojuliao-star wants to merge 15 commits intodevelopmentfrom
fix/forum-ancestry-performance

Conversation

@franciscojuliao-star
Copy link
Copy Markdown

Implementa a gem ancestry para resolver problemas de lentidão no fórum causados por queries recursivas ineficientes.

Mudanças principais

  • Adiciona gem ancestry para gerenciar hierarquia de posts
  • Remove métodos recursivos que causavam N+1 queries
  • Implementa método otimizado posts_for_tree_view
  • Adiciona eager loading para evitar queries desnecessárias

Testes

  • Testado localmente

Observações

  • Necessário para que de fato funcione o ancestry:
    1º Adicionar a coluna ancestry:

rails generate migration AddAncestryColumnToDiscussionPosts ancestry:strin:index
2º Popular a coluna ancestry com os dados existentes
no console do rails: Post.build_ancestry_from_parents_ids!
3º Reiniciar o servidor

- Adiciona ancestry ao Gemfile para gerenciar hierarquia de posts
- Atualiza Gemfile.lock com as dependências
- Atualiza versão do Ruby de 2.7.2 para 2.7.8
@biancastephani
Copy link
Copy Markdown
Member

biancastephani commented Dec 3, 2025

Sobre o passo-a-passo

rails generate migration AddAncestryColumnToDiscussionPosts ancestry:strin:index

não precisa rodar esse generate, porque a migration já foi adicionada ao projeto. precisa rodar só o rake db:migrate

depois bundle install pra atualizar as gems

Post.build_ancestry_from_parents_ids!

Esse comando deu erro pra mim, rodei no singular Post.build_ancestry_from_parent_ids!

biancastephani and others added 3 commits December 3, 2025 15:08
Adiciona suporte dinâmico de paginação ao método posts_for_tree_view,
permitindo navegação entre páginas no modo de visualização em árvore.

Alterações:
- Adiciona parâmetro 'page' ao método posts_for_tree_view
- Atualiza controller para passar params[:page] ao método
- Remove duplicação de .roots e .includes no model
- Remove comentários desnecessários do código
@franciscojuliao-star franciscojuliao-star force-pushed the fix/forum-ancestry-performance branch from fc8c7f7 to 87d0a23 Compare December 4, 2025 12:09
Copy link
Copy Markdown
Member

@biancastephani biancastephani left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. O método de Post.build_ancestry_from_parent_ids! atualizou o updated_at pra data foi rodado o comando de todos que receberam algo na coluna nova, sobrescrevendo a data que o post foi enviado/atualizado de fato. Tá passando pelo callback da timestamp
  • A ordenação não tá funcionando adequadamente, quando há um post filho/neto na árvore mais recente, ele deve levar a árvore inteira pro início da lista. Não deve ordenar apenas pela data do post raiz (exemplo print em anexo. o post "oi" de 08/12 deveria ter subido a árvore inteira pro topo)
  • Algo está fazendo demorar mais o carregamento do partial _post.html.haml do que o método original
posts

Configuração necessária para popular a coluna ancestry sem alterar
os campos updated_at dos posts existentes. Isso preserva os timestamps
originais que são importantes para ordenação por última atividade.
Mudanças no model Post:
- Adiciona callbacks para manter last_activity_at atualizado
- Implementa método update_last_activity que propaga timestamp
  para o post e todos os ancestrais
- Atualiza scope order_by_ancestry para ordenar por última atividade
- Modifica can_change? para permitir atualização do updated_at

O método update_last_activity usa path_ids do ancestry para
atualizar toda a cadeia de ancestrais em apenas 2 queries SQL.
Mudanças no PostsController:
- Adiciona eager loading dos filhos dos posts da página atual
- Evita N+1 queries ao renderizar post.children na view
- Usa includes(:files, :user, :profile) para carregar associações
Mudança na partial _post.html.haml:
- Ordena post.children por last_activity_at DESC
- Garante que comentários recentes apareçam primeiro
- Usa id DESC como critério de desempate

Comentários com atividade recente agora aparecem no topo
dentro de cada post, melhorando a experiência do usuário.
O que essa migration faz:
1. Adiciona coluna last_activity_at
2. Popula automaticamente para posts existentes usando query SQL otimizada
3. Para cada post, busca o updated_at mais recente de toda a sua subárvore
4. Adiciona índice para otimizar ordenação
@franciscojuliao-star franciscojuliao-star force-pushed the fix/forum-ancestry-performance branch from 4004b7e to f495043 Compare December 10, 2025 16:57
biancastephani and others added 6 commits December 10, 2025 14:51
Remove a coluna parent_id e seu índice da tabela discussion_posts,
pois o relacionamento hierárquico agora é gerenciado pela gem ancestry
através da coluna ancestry.
Comenta a associação belongs_to :parent e substitui todas as referências
de parent_id por ancestry nas validações, callbacks e métodos privados,
adequando o model para uso da gem ancestry.
Substitui parent_id por ancestry nas queries, respostas JSON e parâmetros
permitidos, mantendo compatibilidade com a gem ancestry para hierarquia
de posts.
Substitui parent_id por ancestry no formulário e em todas as variáveis
JavaScript, garantindo que o frontend funcione corretamente com a gem
ancestry.
Envolve a geração de links do menu em um bloco begin/rescue para capturar
ActionController::UrlGenerationError e ignorar menus cujas rotas não existem
na aplicação, evitando que o menu quebre quando há menus cadastrados no banco
mas sem rotas correspondentes implementadas.
@franciscojuliao-star franciscojuliao-star force-pushed the fix/forum-ancestry-performance branch from f21d10a to 4e16681 Compare December 19, 2025 11:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants