هل تأثر تحويل الحقول المخصصة بالتحديث الأخير؟

تم الإبلاغ عن أخطاء متعددة في إضافة الأحداث خلال اليومين الماضيين، وتبدو جميعها مرتبطة بمشاكل تحويل الأنواع في الحقول المخصصة. لم يتم تحديث إضافة الأحداث بشكل جوهري منذ بضعة أشهر.

في ملف 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، كانت هناك بعض التغييرات خلال الأسبوع الماضي قد تكون أثرت على هذا، خاصةً:

@eviltrout هل لديك أي أفكار حول هذا؟

في حال كانت هذه هي المشكلة التي تسبب المتاعب، إليك شرح للنتائج (قد تجعل موقعك غير قابل للاستخدام):

كان هذا خطأ معروفًا في الحقول المخصصة.

في ظروف محددة جدًا، كان يقوم بحفظ القيمة عدة مرات، مما يؤدي إلى إنشاء مصفوفة (Array)، بينما كنت تريد فقط عددًا صحيحًا (Integer).

يمكنك إصلاح ذلك عن طريق التأكد من وجود صف واحد فقط لكل حقل مخصص في قاعدة البيانات.

نعم، ظهر هذا عدة مرات في الماضي. يبدو أن هذه الموجة الأخيرة تتزامن مع العمل الأخير على ملف has_custom_fields.rb، لذا قد يكون هناك ما يستحق المراجعة هناك.

هذا لا يصلح المشكلة، لكنه يساعد في التعامل معها في حال ظهورها:

توصيتي العامة هنا هي أنه بصفتك مطوّر إضافة، يجب أن تضيف دائمًا فهارس في عملية الترحيل لفرض القيود بشكل صحيح. في الواقع، تتجنب الغالبية العظمى من الإضافات التي نكتبها هذه الأيام استخدام الحقول المخصصة إلا عند الحاجة القصوى، وتفضل استخدام جداول مخصصة يسهل فهمها وإدارتها. في هذه الحالة المحددة، تريد إنشاء فهرس كما يلي:

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

غير متأكد مما نحتاج فعله آخر في النواة هنا، لقد فكرنا في إعادة هيكلة الحقول المخصصة لكننا قلقون بشأن ذلك إلى حد ما. أحد الأشياء التي أفكر فيها هو ببساطة إزالة دعم المصفوفات من الحقول المخصصة لأنها تتسبب في عدد هائل من المشاكل على مر السنين.

عذرًا على إحياء هذا الموضوع، لكن إحدى هذه الظروف هي عند استخدام مؤشر من نوع رمز (symbol)، مثل custom_fields[:hello] عند تحديث القيمة الحالية. في هذه الحالة، يتم إضافة حقل آخر بدلاً من تحديث الحقل الموجود، مما يؤدي إلى ظهور مصفوفة. وهذا قد يكون الشرط الوحيد برأيي.

من المؤكد أن هذا الإصلاح سيحل الأثر الجانبي الناتج.