За последние два дня было получено множество сообщений об ошибках в плагине событий, и все они, по-видимому, связаны с приведением типов кастомных полей. Плагин событий не получал существенных обновлений уже несколько месяцев.
Файл plugin.rb приводит event_start к типу integer:
def has_event?
self.custom_fields['event_start']&.nonzero?
end
Сама ошибка имеет следующий формат:
NoMethodError (undefined method `nonzero?' for [1563127206, 1563127206]:Array)
Насколько я понимаю, register_custom_field_type должен гарантировать, что кастомное поле всегда возвращается в указанном типе (возможно, я что-то неправильно понимаю).
Просматривая concern has_custom_fields.rb, можно заметить, что за последнюю неделю было внесено несколько изменений, которые могли повлиять на эту ситуацию, в частности:
@eviltrout, есть ли у вас какие-либо мысли по этому поводу?
Это был известный баг, связанный с пользовательскими полями.
При очень специфических условиях значение сохранялось несколько раз, что приводило к созданию массива (Array), хотя требовалось только целое число (Integer).
Вы можете исправить это, убедившись, что в базе данных для каждого пользовательского поля есть только одна строка.
Да, она возникала несколько раз в прошлом. Эта последняя волна, похоже, совпадает с недавней работой над компонентом has_custom_fields.rb, поэтому, возможно, там есть что проверить.
Это не исправляет проблему, но помогает справиться с ней, если она возникнет:
Моя общая рекомендация как автору плагина: всегда добавляйте индексы в миграции, чтобы корректно применять ограничения. На самом деле, большинство плагинов, которые мы пишем сейчас, избегают пользовательских полей, если в них нет абсолютной необходимости, и предпочитают использовать пользовательские таблицы, с которыми гораздо проще работать. В данном конкретном случае вам нужен индекс:
create unique index idxStartEvent on topic_custom_fields(topic_id) where name = 'start_event'
Не совсем понятно, что еще нужно сделать в ядре. Мы рассматривали возможность переработки пользовательских полей, но несколько опасались этого. Одна из идей, которую я обдумываю, — просто отказаться от поддержки массивов в пользовательских полях, так как они годами вызывают огромное количество проблем.
Извините за поднятие темы, но одно из условий возникает при использовании символьного индекса, например custom_fields[:hello]. При обновлении существующего значения добавлялось новое поле вместо обновления, что приводило к появлению массива. На мой взгляд, это единственное такое условие.
Это, скорее всего, исправит возникший побочный эффект.