Anpassung benutzerdefinierter Felder durch aktuelles Update betroffen?

In den letzten zwei Tagen sind mehrere Fehlerberichte zum Events-Plugin eingegangen, die alle auf Typumwandlungsprobleme bei benutzerdefinierten Feldern zurückzuführen scheinen. Das Events-Plugin wurde seit einigen Monaten nicht substantiell aktualisiert.

Die Datei plugin.rb wandelt event_start in eine Ganzzahl um:

Topic.register_custom_field_type('event_start', :integer)

Der Fehler wird hier ausgelöst:

def has_event?
  self.custom_fields['event_start']&.nonzero?
end

Der Fehler selbst folgt diesem Format:

NoMethodError (undefined method `nonzero?' for [1563127206, 1563127206]:Array)

Soweit ich register_custom_field_type verstehe, sollte es sicherstellen, dass das benutzerdefinierte Feld immer den definierten Typ zurückgibt (vielleicht habe ich es missverstanden).

Beim Betrachten der Concern-Datei has_custom_fields.rb gab es in der letzten Woche einige Änderungen, die dies beeinflusst haben könnten, insbesondere:

@eviltrout Hast du dazu Gedanken?

Falls dies tatsächlich der Fehler ist, der Probleme verursacht, erkläre ich hier die Konsequenzen (es kann Ihre Website unbrauchbar machen):

Dies war ein bekannter Fehler bei benutzerdefinierten Feldern.

Unter sehr spezifischen Bedingungen wurde der Wert mehrfach gespeichert, wodurch ein Array entstand, obwohl nur eine Ganzzahl erwartet wurde.

Sie können dies beheben, indem Sie sicherstellen, dass es im Datenbank nur einen Eintrag pro benutzerdefiniertem Feld gibt.

Ja, das ist in der Vergangenheit schon ein paar Mal aufgetreten. Diese jüngste Welle scheint mit der aktuellen Arbeit am Concern has_custom_fields.rb zusammenzufallen, sodass es dort möglicherweise etwas zu überprüfen gibt.

Dies behebt das Problem nicht, hilft aber, es zu adressieren, falls es erneut auftritt:

Meine allgemeine Empfehlung als Plugin-Autor ist, dass Sie in einer Migration immer Indizes hinzufügen sollten, um die Einschränkung ordnungsgemäß durchzusetzen. Tatsächlich vermeiden die meisten Plugins, die wir heutzutage entwickeln, benutzerdefinierte Felder, es sei denn, sie sind absolut notwendig, und bevorzugen benutzerdefinierte Tabellen, die viel leichter zu verstehen sind. In diesem speziellen Fall benötigen Sie einen Index von:

create unique index idxStartEvent on topic_custom_fields(topic_id) where name = 'start_event'

Ich bin mir nicht sicher, was wir sonst noch im Core tun müssen. Wir haben eine Überarbeitung der benutzerdefinierten Felder in Betracht gezogen, sind jedoch etwas besorgt darüber. Eine Sache, die ich erwäge, ist, die Array-Unterstützung bei benutzerdefinierten Feldern einfach zu entfernen, da sie über die Jahre enorme Probleme verursacht haben.

Entschuldigt bitte das Aufwärmen dieses Threads, aber eine der Bedingungen tritt auf, wenn ihr einen Symbol-Index verwendet, also z. B. custom_fields[:hello]. Beim Aktualisieren eines bestehenden Werts wurde stattdessen ein weiteres Feld hinzugefügt, was zu einem Array führte. Meines Erachtens ist dies die einzige Bedingung.

Dies sollte den verursachten Seiteneffekt mit ziemlicher Sicherheit beheben.