Влияет ли недавнее обновление на приведение типов пользовательских полей?

За последние два дня было получено множество сообщений об ошибках в плагине событий, и все они, по-видимому, связаны с приведением типов кастомных полей. Плагин событий не получал существенных обновлений уже несколько месяцев.

Файл plugin.rb приводит event_start к типу integer:

Topic.register_custom_field_type('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]. При обновлении существующего значения добавлялось новое поле вместо обновления, что приводило к появлению массива. На мой взгляд, это единственное такое условие.

Это, скорее всего, исправит возникший побочный эффект.