استيراد CSV للعلامات / مجموعات العلامات حساس لحالة الأحرف، ولكنه ليس كذلك

التكاثر:

  • لديك علامة تسمى ABC
  • قم بإنشاء ملف CSV بعلامة abc
  • انتقل إلى /tags وقم بتحميل ملف CSV
  • شاهد فشله مع “عذرًا، حدث خطأ أثناء تحميل foo.csv. يرجى المحاولة مرة أخرى.”

يحدث هذا لأن العلامات حساسة لحالة الأحرف ولكن يجب أن تكون فريدة مع تجاهل حالة الأحرف.

إذا كان لديك ملف به 1000 علامة، فسيكون من الصعب جدًا معرفة أين يكمن الخطأ.

code يفعل هذا

TAG = Tag.find_by_name(tag_name) || Tag.create!(name: tag_name)
...
Tag_group = TagGroup.find_by(name: tag_group_name) || TagGroup.create!(name: tag_group_name)

وهو نمط سيء، نظرًا لأن find_by_name حساس لحالة الأحرف و create! ليس كذلك [1] لذا فإنه يخطئ مع ActiveRecord::RecordInvalid : Validation failed: Name has already been taken

يجب أن يكون هذا شيئًا مثل

tag = Tag.where('name ILIKE ?', tag_name).first || Tag.create!(name: tag_name)


  1. لأن validates :name, presence: true, uniqueness: { case_sensitive: false } ↩︎

3 إعجابات

شكراً للإبلاغ، ضع علامة pr-welcome على هذا، أعتقد أننا بحاجة إلى تغيير find_by_name لإجراء بحث غير حساس لحالة الأحرف.

بالنظر إلى أن لدينا:

سيكون الإصلاح:

Tag = Tag.where('lower(name) = ?', tag_name.downcase).first

TagGroup يفتقد الفهرس، لذا سنحتاج إلى إضافته ثم القيام بنفس الشيء هناك.

مرحباً @RGJ

لم أتمكن من إعادة إنتاج مشكلتك باستخدام علامة عادية ولكن حصلت على الخطأ الذي ذكرته باستخدام مجموعة علامات

هذه هي عينة CSV الخاصة بي:

ABC,TAGGROUP

تعمل ABC بشكل جيد، ولكن مع مجموعة العلامات، سيحدث خطأ. إذا كان بإمكانك مشاركة عينة CSV، فسأكون سعيدًا جدًا بالمساعدة!

لقد قمت بإنشاء PR لإصلاح مشكلة مجموعة العلامات. أيضًا، هل SiteSetting.force_lowercase_tags ممكّن في منتدىك؟

إعجاب واحد (1)

لا، إنه غير محدد. آسف، أرى الآن أن هذا مهم.

لست متأكدًا من كيفية محاولتك إعادة الإنتاج، ولكن يجب أن يحتوي ملف CSV على abc بأحرف صغيرة ويجب إلغاء تحديد force_lowercase_tags.

إعجاب واحد (1)

لا تقلق، لقد كان إعداد موقع وجدته أثناء البحث في الكود، قد يكون مهمًا!

هل ملف CSV الخاص بك هو فقط abc بدون مجموعات علامات؟

مثال الاختبار الخاص بنا هو (وقد اختبرت محليًا، مع وجود capitaltag2 بأحرف كبيرة، ولكنه عمل كما هو متوقع):

لا يمكنني بالفعل إعادة إنتاجه باستخدام علامة وحدها.

لقد ارتكبت خطأً بسيطًا في منشوري الأصلي:

Tag.find_by_name غير حساس لحالة الأحرف (جيد) و Tag.find_by(name: ) حساس لحالة الأحرف (سيء).
هذا لأن ديفيد قام بالفعل بإصلاحه للعلامات قبل 7 سنوات عن طريق تجاوز طريقة find_by_name.

بالنسبة لـ TagGroup، لم يتم تطبيق هذا الإصلاح مطلقًا.

إعجابَين (2)