مُستكشف البيانات `int_list` يستبدل العنصر الأول بالصفر

لا أملك يقينًا إن كان هذا خطأً برمجيًا أم أنني أقوم بشيء خاطئ، لكن يبدو أن العنصر الأول في مصفوفة int_list يُستبدل دائمًا بالصفر في استعلام مستكشف البيانات.

على سبيل المثال:

-- int_list :categories = "3, 5, 6"

يتحول إلى [0, 5, 6]

عند النظر في:

إذا قمت بذلك في وحدة التحكم (console)، أحصل على النتيجة المتوقعة:

string = "3,5,6"
value = string.split(',').map { |s| s.downcase == '#null' ? nil : s.to_i }
=> [3, 5, 6]

يمكنك إعادة إنتاج المشكلة باستخدام هذا الاستعلام:

-- [params]
-- int_list :categories = "3, 5, 6"

SELECT *
FROM topics 
WHERE topics.category_id = ANY (ARRAY [ :categories ]  )

لإحداث الخطأ (بحيث يمكنك رؤية رسالة الخطأ)، ما عليك سوى إزالة القوس المغلق، على سبيل المثال:

-- [params]
-- int_list :categories = "3, 5, 6"

SELECT *
FROM topics 
WHERE topics.category_id = ANY (ARRAY [ :categories   )
PG::SyntaxError: ERROR:  syntax error at or near ")"
LINE 12: WHERE topics.category_id = ANY (ARRAY [ 0,5,6   )
                                                         ^

(انظر إلى المصفوفة)

يبدو أن ما يحدث عند تعيين قيمة افتراضية لمعلمة int_list بهذه الطريقة:

-- int_list :categories = "3, 5, 6"

هو تنفيذ ما يلي:

'"1'.downcase.to_i

وهو ما سيعيد 0.

يمكنك تجاوز هذه المشكلة بحذف علامات الاقتباس عن المعلمة الافتراضية:

-- int_list :categories = 3, 5, 6

تُفسَّر هذه القيمة كسلسلة نصية قبل تقسيمها إلى مصفوفة. ربما ينبغي للإضافة إزالة علامات الاقتباس الخارجية إذا أُضيفت إلى مدخل من نوع السلسلة النصية.

شكرًا لك يا سايمون! :smiley:

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

للعلم، أجد أن التعامل مع المعاملات (params) أمر محير للغاية. أتساءل عما إذا كان يجب علينا نقل هذا إلى تجربة مستخدم كاملة بدلاً من التعليقات السحرية @riking

نعم، من المنطقي تمامًا القيام بذلك. كانت التعليقات السحرية تُحسّن لتقليل عدد عمليات ترحيل قاعدة البيانات المستمدة من الإضافات، وهي مشكلة أقل بكثير في الوقت الحالي.