Negli ultimi due giorni sono stati segnalati diversi bug relativi all’plugin eventi, tutti apparentemente legati a problemi di conversione del tipo per i campi personalizzati. Il plugin eventi non è stato aggiornato in modo sostanziale da alcuni mesi.
Il file plugin.rb converte event_start in un intero:
def has_event?
self.custom_fields['event_start']&.nonzero?
end
L’errore stesso segue questo formato:
NoMethodError (undefined method `nonzero?' for [1563127206, 1563127206]:Array)
Per quanto ne so, register_custom_field_type dovrebbe garantire che il campo personalizzato restituisca sempre il tipo definito (forse ho frainteso).
Osservando il concern has_custom_fields.rb, ci sono stati alcuni cambiamenti nell’ultima settimana che potrebbero aver influito su questo, in particolare
Sì, è riemerso alcune volte in passato. L’ultima ondata sembra coincidere con i recenti lavori sulla concern has_custom_fields.rb, quindi potrebbe esserci qualcosa da rivedere lì.
Questo non lo risolve, ma aiuta a gestirlo se si presenta:
La mia raccomandazione generale qui è che, in qualità di autore di plugin, dovresti sempre aggiungere indici in una migrazione per imporre correttamente il vincolo. In effetti, la maggior parte dei plugin che scriviamo oggi evita i campi personalizzati a meno che non siano assolutamente necessari e preferisce l’uso di tabelle personalizzate, che sono molto più semplici da gestire. In questo caso specifico, desideri un indice del tipo:
create unique index idxStartEvent on topic_custom_fields(topic_id) where name = 'start_event'
Non sono sicuro di cosa altro sia necessario fare nel core qui; abbiamo considerato un aggiornamento dei campi personalizzati, ma siamo un po’ preoccupati al riguardo. Una cosa che sto prendendo in considerazione è semplicemente eliminare il supporto per gli array dai campi personalizzati, poiché negli anni hanno causato un’enorme quantità di problemi.
Scusa per aver riportato in alto questo argomento, ma una delle condizioni si verifica quando si usa un indice di tipo simbolo, ad esempio custom_fields[:hello], aggiornando un valore esistente: invece di aggiornarlo, aggiunge un altro campo, risultando in un array. Secondo me, questa potrebbe essere l’unica condizione.
Questo dovrebbe correggere con ogni probabilità l’effetto collaterale causato.