Nos últimos dois dias, foram feitos vários relatórios de bugs sobre o plugin de eventos, todos relacionados a problemas de conversão de tipo em campos personalizados. O plugin de eventos não recebeu atualizações substanciais há alguns meses.
O arquivo plugin.rb converte event_start para inteiro:
def has_event?
self.custom_fields['event_start']&.nonzero?
end
O próprio erro segue este formato:
NoMethodError (undefined method `nonzero?' for [1563127206, 1563127206]:Array)
Pelo que entendo, register_custom_field_type deveria garantir que o campo personalizado sempre retorne o tipo definido (talvez eu esteja entendendo errado).
Analisando a preocupação has_custom_fields.rb, houve algumas alterações na última semana que podem ter afetado isso, em particular:
Sim, isso apareceu algumas vezes no passado. Essa última onda parece coincidir com o trabalho recente no concern has_custom_fields.rb, então pode haver algo para revisar ali.
Isso não corrige o problema, mas ajuda a abordá-lo caso ele surja:
Minha recomendação geral aqui é que, como autor de um plugin, você sempre adicione índices em uma migração para impor corretamente a restrição. Na verdade, a maioria dos plugins que escrevemos atualmente evita campos personalizados, a menos que sejam absolutamente necessários, e prefere usar tabelas personalizadas, que são muito mais fáceis de analisar.
Neste caso específico, você precisa de um índice assim:
create unique index idxStartEvent on topic_custom_fields(topic_id) where name = 'start_event'
Não tenho certeza do que mais precisaríamos fazer no núcleo aqui. Já consideramos uma reformulação dos campos personalizados, mas estamos um pouco preocupados com isso. Uma coisa que estou considerando é simplesmente remover o suporte a arrays dos campos personalizados, pois eles têm causado enormes quantidades de problemas ao longo dos anos.
Desculpe por ressuscitar este tópico, mas uma das condições ocorre quando você usa um índice de símbolo, ou seja, custom_fields[:hello], ao atualizar o valor existente. Nesse caso, ele adiciona outro campo em vez de atualizar, resultando em um array. Na minha opinião, essa pode ser a única condição.
Isso deve corrigir o efeito colateral causado com certeza.