أولاً، شكرًا جزيلاً لك على مساعدتك! إنها بالفعل خطأ مثير للاهتمام.
المشكلة هي أنني قد أحتاج إلى تغيير اسم المستخدم عبر قاعدة البيانات، لأن المسار غير متاح
هل يمكنك تزويدي بالاستعلام المطلوب؟
أعتقد أن هذا غير ممكن، لأنه في هذه الحالة سأمنع العديد من الأسماء التي تبدأ بحرف Σ في اليونان (وسأكسر فعليًا تسجيل الدخول عبر فيسبوك لهؤلاء المستخدمين). هل يمكنني منع نمط تعبير منتظم (regex) محدد؟ بحيث أتأكد من أن حرف Σ موجود على الأقل في النهاية؟
عضو آخر سجل مع نفس المشكلة تمامًا. نقطي هنا هي أنه بالنسبة لنا، هذه ليست حالة هامشية. هناك literally آلاف الأسماء اليونانية التي تستخدم حرف Σ (أو ς) في نهاية الاسم.
وبشكل غير محظوظ، نظرًا لفئتنا العمرية الأساسية (> 40)، هناك العديد من الأعضاء الذين تظهر أسماءهم مكتوبة بأحرف كبيرة على فيسبوك ()، لذا عندما يستخدمون تسجيل الدخول عبر فيسبوك، يتم نسخ اسمهم إلى حقل اسم المستخدم…
لا تقلق بشأن Postgres. يجب أن نقارن دائمًا بـ username_lower في SQL ولا نعتمد على LOWER()، لأن username_lower ليس مجرد النسخة الصغيرة من اسم المستخدم. نحن نطبق أيضًا التطبيع Unicode.
أتفق معك. إضافة حل مؤقت إلى User.normalize_username يجب أن يكون كافياً حتى الآن. هناك بالفعل بعض النقاش في عيب Ruby ويبدو أنه لا يوجد حل سهل. ومع ذلك، نحن محظوظون، لأن كل ما نحتاجه هو التحقق من آخر حرف في اسم المستخدم. هذا أسهل بكثير من القيام بذلك في جملة كاملة.
صحيح. ومع ذلك، يجب أن يكون الأمر أسهل بكثير من التنفيذ الكامل، حيث أننا بحاجة للقلق فقط بشأن رموز معينة مثل الشرطة السفلية والشرطة العلوية وربما الأرقام؟ يجب أن يكون ذلك ممكنًا.
أعلم أنني أبتعد عن مناقشة هذه المشكلة المحددة، لكن عندما أفكر في هذه القضية، لا يمكنني تجاهل حقيقة أنه يمكن تجنبها.
لقد اكتشفت أن هناك بعض مسارات API في Discourse تشير إلى مستخدم عبر userId، بينما أخرى تشير إلى مستخدم عبر username. ألا ينبغي أن يكون هذا أكثر اتساقًا (بمصلحة userId)؟
ربما بتطبيق شيء مشابه لما يحدث حاليًا مع التصنيفات/الوسوم؟ بحيث يتوفر كل من username وuserId في الرابط، على سبيل المثال: https://meta.discourse.org/u/chrispanag/4387
في عام 2016، كان @eviltrout ضد ذلك، ولا أعرف موقفه الحالي منه.
على أي حال، لدي حل بديل في Discourse في هذا طلب الدمج:
سيتم من خلاله معالجة مشكلة التسجيل الجديدة في فيسبوك عن طريق تحويل أي اسم مستخدم يحتوي على حرف السيجما في البداية إلى أحرف صغيرة. هذا يعني أن كل ما تحتاجه هو تعديل اسم مستخدم سبيروس وأي مستخدمين آخرين لديهم سيجما نهائية بتحويلها إلى أحرف صغيرة، وستختفي المشكلة على المدى الطويل.
ما زلت لا أحب استخدام المعرفات (IDs) في كل مكان، لكنني أدرك أن هناك العديد من الحالات التي يكون فيها ذلك منطقيًا.
في تلك الحالات، سأفضل شيئًا مثل id-username حيث يكون username أي شيء يمكننا وضعه في عنوان URL. يمكن تجاهله حتى بواسطة الموجه. لكن على الأقل عند مشاركة الرابط، ستحصل على فكرة عما تشير إليه.
أعتقد أنه سيكون من المفيد استخدام المعرف (ID) بدلاً من اسم المستخدم (أو كلاهما، ولكن الاعتماد فقط على المعرف، كما هو موضح أعلاه) على الأقل في صفحة ملف المستخدم، بحيث يتمكن المسؤول من تغيير اسم المستخدم باستخدام واجهة مستخدم Discourse دون الحاجة إلى تشغيل الأمر في وحدة تحكم Rails إذا حدث خطأ ما مع اسم المستخدم.
علينا أن نقلق فقط بشأن الأحرف التي تختلف فيها تحويلات الحروف الصغيرة بين تنفيذي JavaScript وRuby. وليس العكس.
لا توجد قاعدة تحدد كيفية تحويل الحرف الصغير الألماني “ß” إلى حروف كبيرة. فقد يكون التحويل إلى “SS” أو “SZ” أو حتى الحرف الكبير الجديد “ẞ” (نعم، هناك فرق دقيق). ولا يمكن عكس هذه العملية إلا في حالة “ẞ”، وهذا يعمل بشكل صحيح في Ruby وJavaScript.
أعتقد أننا يجب أن نتخذ الخطوات التالية:
دمج الحل البديل الذي اقترحه @sam لحل المشكلة المباشرة.
إزالة LOWER(username) من استعلامات SQL، لأن ذلك مجرد ممارسة سيئة ™ (مثلًا: عدم وجود تطبيع يونيكود).
نأمل أن تقوم Ruby بإصلاح المشكلة الجذرية.
على المدى الطويل: التفكير في إضافة معرفات المستخدمين إلى المسارات. أظن أن أصعب جزء سيكون تحديد كيفية التعامل مع علامات الاقتباس والذكر.