Custom_fields تحديث يسبب تحول القيمة إلى مصفوفة

يبدو أن هذا الخطأ قد تم إصلاحه منذ فترة من خلال هذا المنشور. Custom_fields simultaneous save with json becomes an array

للأسف، أتعامل الآن مع نقاط نهاية متعددة يتم استدعاؤها في نفس الوقت لتحديث حقول المستخدم المخصصة (custom_fields) في آن واحد، مما يتسبب في تحول القيم التي قمت بتعيينها كـ :text إلى مصفوفات.

تم استدعاء 3 نقاط نهاية وتعيين custom_field كمصفوفة بدلاً من نص

هل يمكنكم المساعدة؟ هذا يعيق مشروعي بالكامل في الوقت الحالي…

أواجه هذه المشكلة في الإصدار 2.5.0.beta7 أثناء التطوير المحلي.

هل توجد طريقة لوضع قفل على قاعدة البيانات حتى يتم حفظ القيم في هذه الحالة؟

هل يمكن أن يكون هذا هو المشكلة التي أواجهها؟ Differences between transactions and locking - makandra dev

لاحظ أنه عندما يتم تشغيل عمليتين في آن واحد في خيطين، لا يرى كل خيط تغييرات العملية الأخرى حتى يتم تأكيدهما بنجاح. ومع ذلك، يرى كل خيط تغييراته الخاصة (هذه شرح مبسط، والواقع أكثر تعقيدًا بكثير).

def self.cast_custom_field(key, value, types, return_array = true)

يُظهر القيم العادية، مما يجعلني أعتقد أنه تم إنشاء صفوف متعددة.

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

نعم، لقد رأيت ذلك :worried:

للأسف، أنا الآن أواجه تحديث بيانات حساسة في الوقت نفسه. أعتقد أن هذا يحدث لأنني أقوم بذلك عبر نقاط النهاية، ولكن هذه هي الطريقة الوحيدة التي أستطيع بها القيام بذلك، ولا أملك تحكماً في المكالمات. قد تكون مكالمة واحدة، وقد تكون 10.

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

تتضمن البيانات بيانات الدفع :cry:

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

  1. يمكنك إضافة فهرس فريد على الحقل المخصص (الاسم، معرف المستخدم)
  2. يمكنك تغليف الكود الخاص بك بـ DistributedMutex
  3. يمكنك استخدام تصميم جدول بدلاً من الحقول المخصصة

شيء مثل هذا؟ يبدو أنه يعمل.

DistributedMutex.synchronize("user_data_update_#{user.id}") do
    user.save_custom_fields(true)
end

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

شكرًا لكم يا أصدقاء @eviltrout @fzngagan