En los últimos dos días se han recibido múltiples informes de errores sobre el plugin de eventos, y todos parecen estar relacionados con problemas de conversión de tipos en campos personalizados. El plugin de eventos no ha recibido actualizaciones sustanciales en varios meses.
El archivo plugin.rb convierte event_start a entero:
def has_event?
self.custom_fields['event_start']&.nonzero?
end
El propio error sigue este formato:
NoMethodError (undefined method `nonzero?' for [1563127206, 1563127206]:Array)
Según mi comprensión, register_custom_field_type debería garantizar que el campo personalizado siempre devuelva el tipo definido (quizás lo estoy malinterpretando).
Al revisar el concern has_custom_fields.rb, ha habido algunos cambios en la última semana que podrían haber afectado esto, en particular:
En caso de que este sea efectivamente el error que está causando problemas, aquí explico las consecuencias (podría hacer que tu sitio sea inutilizable):
Sí, ha surgido algunas veces en el pasado. Esta última oleada parece coincidir con el trabajo reciente en el concern has_custom_fields.rb, por lo que podría haber algo que revisar allí.
Esto no lo corrige, pero ayuda a abordarlo si surge:
Mi recomendación general aquí es que, como autor de un plugin, siempre debes agregar índices en una migración para hacer cumplir correctamente la restricción. De hecho, la mayoría de los plugins que escribimos hoy en día evitan los campos personalizados a menos que sean absolutamente necesarios y prefieren usar tablas personalizadas, que son mucho más fáciles de entender.
En este caso específico, necesitas un índice de:
create unique index idxStartEvent on topic_custom_fields(topic_id) where name = 'start_event'
No estoy seguro de qué más necesitamos hacer en el núcleo aquí. Hemos considerado una revisión de los campos personalizados, pero estamos algo preocupados al respecto. Una cosa que estoy considerando es simplemente eliminar la compatibilidad con arrays de los campos personalizados, ya que han estado causando una enorme cantidad de problemas a lo largo de los años.
Perdón por reactivar este tema, pero una de las condiciones ocurre cuando se utiliza un índice de símbolo, es decir, custom_fields[:hello], al actualizar un valor existente; en lugar de actualizarlo, se añadía otro campo, lo que resultaba en un array. Esta podría ser la única condición, en mi opinión.
Esto debería corregir el efecto secundario causado, casi con total seguridad.