Substituindo métodos include_* em serializadores

Olá @david,

Uma pergunta rápida sobre a lógica por trás dessa descontinuação

Aviso de descontinuação: add_to_serializer não deve ser usado para substituir diretamente os métodos include_*?

Contexto: DEV: Improve add_to_serializer include_* options (#21220) · discourse/discourse@26b7f8a · GitHub

Entendo o desejo de mover os usuários para o argumento include_condition em um uso padrão do método add_to_serializer, ou seja, para adicionar seus próprios métodos aos serializadores.

No entanto, há algumas instâncias em que um plugin pode querer adicionar um método include_* a um serializador que não corresponda a esse caso, ou seja, quando você não está determinando se seu próprio atributo personalizado está incluído, mas está substituindo um método include_* em um serializador principal, por exemplo:

Método principal: discourse/app/serializers/site_serializer.rb at main · discourse/discourse · GitHub

Aprecio que esse uso em particular possa ser repensado para não exigir a substituição do método do serializador principal, ou que a substituição possa ser alcançada de outras maneiras, mas estou me perguntando se há alguma desvantagem inerente em permitir tal uso do método add_to_serializer dessa forma, e se a descontinuação levará à remoção do uso do método dessa maneira.

4 curtidas

Sim, essa seria a minha recomendação.

Recentemente, introduzimos um novo sistema para ‘modificadores de plugin’, que são pontos de extensão super baratos e semelhantes ao DiscourseEvent, mas eles recebem um valor de entrada e retornam um valor. Portanto, no seu caso, você poderia fazer um PR principal para adicionar uma chamada DiscoursePluginRegistry.apply_modifier no método include_ relevante e, em seguida, usar register_modifier no seu plugin para substituir o valor.

É provável que eventualmente o bloqueemos completamente, sim. Além disso, você realmente não vai querer usar um método que está gerando ruído de depreciação nos logs.

Se você realmente precisar substituir um método sem a cooperação do core, então modify_class pareceria a melhor escolha. A principal razão pela qual temos um add_to_serializer dedicado é porque ele define automaticamente um método include_*, para que ele só se aplique quando o plugin estiver habilitado.

Isso significa que o trecho de código que você vinculou está atualmente definindo dois métodos. include_wizard_required? e include_include_wizard_required? :sweat_smile:

11 curtidas

Esse Readme diz que ele “opera como uma pilha (primeiro a entrar, primeiro a sair)”, mas isso é uma fila. Uma pilha é primeiro a entrar, último a sair. (Não consigo descobrir nem como copiar o texto no meu celular).

4 curtidas

boa observação. sim, pilha é LIFO e fila é FIFO

Principais recursos desses modificadores:

  • Operam em uma pilha (primeiro registrado, primeiro chamado)
  • Desabilitados automaticamente quando o plugin é desabilitado
  • Passam o resultado cumulativo de todas as invocações de bloco para o chamador
1 curtida

É mais como uma ‘pilha de middleware’: uma série de métodos que são executados em ordem, cada um passando seu resultado para a entrada do próximo método.

Não acho que tentar aplicar a terminologia LIFO/FIFO aqui funcione: nada está sendo adicionado/removido da ‘pilha’ - não há ‘saída’.

4 curtidas

Ah. Então não é uma estrutura de dados de pilha.

Comecei a dizer algo sobre como obtive meu diploma de ciência da computação em 1987 e não sabia o que as pessoas aprendiam agora. :joy:

2 curtidas

este é meio que o meu problema. tenho uma lacuna recente de quase 10 anos em que mal cheguei perto de um computador (depois de mais de 25 anos trabalhando com eles) e parece uma seção de base de conhecimento enorme que está faltando.

3 curtidas

Este tópico foi fechado automaticamente 30 dias após a última resposta. Novas respostas não são mais permitidas.