هل توجد طريقة لتغيير أسماء المستخدمين دفعة واحدة (ملاحظة: ليس أسماء الحسابات)

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

هل توجد طريقة بسيطة نسبيًا لتغيير هذه الأسماء دفعة واحدة من the_name@example.com إلى the_name (أي قص كل شيء بدءًا من ‘@’ وما بعده) دون الحاجة للدخول إلى كل ملف شخصي وتغييرها يدويًا واحدًا تلو الآخر؟

يمكنك القيام بذلك من وحدة تحكم Rails. الأمر أكثر تعقيدًا مما يمكن شرحه هنا، خاصةً لأن عناوين البريد الإلكتروني لم تعد موجودة في سجل المستخدم. إذا كان لديك ميزانية، يمكنك النشر في قناة Marketplace أو التواصل معي مباشرة.

أو ربما لا تهتم بعنوان البريد الإلكتروني الفعلي…

شيء مثل

users = User.where ('username like'%@%''")

ثم تقوم بالمرور عبر النتائج واستخدام دالة gsub لحذف كل شيء من علامة @ إلى النهاية. هذا أفضل ما يمكنني تقديمه من هاتفي.

أقدر ردك يا @pfaffman. يمكنني كتابة استعلامات SQL، لكن العمل في وحدة تحكم Rails يقع خارج نطاق خبرتي قليلاً. كيف يمكنني الدخول إلى وحدة تحكم Discourse بلغة بايثون :slightly_smiling_face:؟

سيكون ذلك جميلاً - رغم أنني أدرك أنه قد يكون خطيرًا أيضًا - لو وُجد أداة مثل مستكشف البيانات تسمح لك أيضًا بكتابة استعلام UPDATE.

هل يعرف أحد ما إذا كان هناك طريقة لربط أداة SQL خارجية (مثل Sequel Pro أو ما يعادلها) بقاعدة البيانات قيد التشغيل في نسخة Discourse المستضافة ذاتيًا عبر Docker؟

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

cd /var/discourse
./launcher enter app
rails c

الآن أنت داخل وحدة تحكم Rails.

users = User.where("username like '%@%'")
users.each do |user|
  user.name.gsub!(/@(.*)/, "")
  puts "الاسم الجديد: #{user.name}"
  # user.save
end

أعتقد أن هذا سيقوم بما تريد. إذا بدا لك أنه يعمل، يمكنك إلغاء التعليق عن سطر user.save وتجربة حظك.

قم بنسخة احتياطية أولاً، حسنًا؟ (أو الأفضل، على خادم تجريبي.)

واو، شكرًا جزيلاً على الكود!

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

شكرًا جزيلاً لك يا @pfaffman.

يجب أن تكون بأمان تام إذا بدا puts صحيحًا. بالتوفيق!

إن القطع عند الرمز @ لا يزال يجعل المعلومات الشخصية (عنوان البريد الإلكتروني) مرئية إلى حد كبير للإنترنت الكبير والسيئ (بما أن معظم الأشخاص يستخدمون @gmail.com أو عددًا قليلاً من مقدمي الخدمات الكبار الآخرين). من الأرجح أن يكون من الأفضل تعيينها بنفس قيمة اسم المستخدم.

شكرًا لك @lionel-rowe، هذه نقطة جيدة. لكن أسماء المستخدمين هي بالفعل نفس القيمة (تم إنشاء اسم المستخدم بأخذ كل ما قبل ‘@’ من عنوان البريد الإلكتروني للمستخدم).

هذا الرعب.

كان علي إجراء تغيير طفيف في الكود وإضافة إجراء بسيط لجعله يعمل. إليك الكود المعدل:

users=User.where("name like '%@%'")

ثم بدأ ريلز كونسول في عرض بيانات المستخدمين بشكل متتابع، لذا اضطررت إلى الضغط على q للخروج منه. ثم:

users.each do |user|
  user.name.gsub!(/@(.*)/,"")
  puts "الاسم الجديد: #{user.name}"
  # user.save
end

أظهرت ريلز كونسول بعد ذلك قائمة بالأسماء الجديدة (صحيحة!)، ثم أعادتني إلى عرض متتابع للمستخدمين. اضغط q مرة أخرى.

ثم:

users.each do |user|
  user.name.gsub!(/@(.*)/,"")
  puts "الاسم الجديد: #{user.name}"
  user.save
end

…وبالتالي لم تعد هناك أسماء مستخدمين تحتوي على عناوين بريد إلكتروني، وظهر كل شيء بشكل جيد في واجهة المنتدى الأمامية.

شكرًا مرة أخرى يا @pfaffman على مساعدتك السخية.