最近のアップデートでカスタムフィールドのキャストに影響はありますか?

過去 2 日間で、events plugin に関する複数のバグレポートが寄せられており、それらはすべてカスタムフィールドの型キャスト問題のようです。events plugin は数ヶ月間、実質的な更新が行われていません。

plugin.rb ファイルでは、event_start を整数としてキャストしています:

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 はカスタムフィールドが常に定義された型で返されるようにするはずですが(もしかしたら誤解しているかもしれませんが)。

has_custom_fields.rb Concern を見ると、過去 1 週間でこの問題に影響を与えた可能性のあるいくつかの変更が行われています。特に以下のコミットです:

@eviltrout ご意見をお聞かせください。

もしこれが実際に問題を引き起こしているバグである場合、その影響(サイトが使用不能になる可能性があります)について以下で説明します。

これはカスタムフィールドに関連する既知のバグでした。

非常に特定の条件下では、値が複数回保存され、整数を意図しているのに配列が作成されてしまう問題が発生していました。

データベース内の各カスタムフィールドに対して行が1つだけ存在するようにすることで、この問題を修正できます。

はい、過去にも何度か発生しています。今回の一連の発生は、has_custom_fields.rb Concern に関する最近の作業と時期が一致しているため、そこに見直すべき点があるかもしれません。

これで完全に解決するわけではありませんが、発生した場合の対処に役立ちます。

私の一般的なアドバイスとしては、プラグイン作者の方は、制約を適切に強制するために、マイグレーション時に常にインデックスを追加すべきです。実際、現在作成しているプラグインの多くは、絶対に必要な場合を除いてカスタムフィールドを使用せず、推論がはるかに容易なカスタムテーブルの使用を好んでいます。この具体的なケースでは、以下のインデックスが必要です。

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

コア側で他に何をする必要があるかはっきりしません。カスタムフィールドの刷新を検討したこともありますが、やや懸念があります。一つ検討しているのは、カスタムフィールドから配列サポートを廃止することです。長年にわたり膨大な数の問題を引き起こしているためです。

スレッドを掘り起こして申し訳ありませんが、その条件の一つは、既存の値を更新する際にシンボルインデックス(例:custom_fields[:hello])を使用した場合です。この場合、値が更新されるのではなく、別のフィールドが追加されてしまい、結果として配列が返されてしまいます。これが唯一の条件ではないかと考えられます。

これにより、発生する副作用は確実に修正されるはずです。