رد فعل في ندوة

حسنًا، لقد حدث ذلك الآن، لم أتمكن من تحديث discourse بسبب إضافة retort.

هذا هو خطأ ترحيل قاعدة البيانات الذي حصلت عليه:

لا يمكن إنشاء فهرس فريد "index_post_details_on_post_id_and_key_ccnew_ccnew"
التفاصيل: المفتاح (post_id, key)=(30297, +1|retort) مكرر.

لقد استخدمت هذا البرنامج النصي كأساس لرمز الترحيل الخاص بي. إليك ما فعلته.

  • لإعادة تشغيل discourse، اضطررت إلى تجاوز “version” في ملف قالب .yml إلى التزام منذ حوالي أسبوعين في مستودع discourse
  • إعادة البناء مع إضافة إضافة التفاعلات لإعادة الموقع إلى العمل
  • قمت بتكوين إضافة التفاعلات بنفس مجموعة التفاعلات مثل retort. لا أستخدم أي تفاعل يمكن تفسيره على أنه إعجاب
  • استخدمت البرنامج النصي لـ @mcdanlj مع تعديلات طفيفة مع الخطوات التالية (حيث أردت ترحيل جميع الـ retorts وكان لدي تعيين 1-إلى-1 بين الـ retorts والتفاعلات بالفعل):
  • قم بتشغيل ./launcher enter app
  • قم بتشغيل rails c
  • الصق ما يلي (يبدو أن وحدة تحكم rails ستعيد عرض الرمز بتغييرات أسطر غير صحيحة، لقد أضفت تغييرات أسطر مزدوجة ولكن هذا لم يغير الإخراج حقًا، ولكن إذا واجه شخص ما خطأ في بناء الجملة مع الرمز التالي، فأضف سطرًا إضافيًا بعد كل سطر):
def migrateRetortToReactions()
  retort = "retort".freeze
  emojiType = "emoji".freeze
  usermap = Hash.new { |hash, username| hash[username] = User.find_by_username(username) }
  postmap = Hash.new { |hash, post_id| hash[post_id] = Post.find(post_id) }
  likeType = PostActionType.where(name_key: "like").pluck(:id).first
  PostDetail.where(extra: retort).each do |pd|
    begin
      p = postmap[pd.post_id]
    rescue
      # PostDetail ليس متسقًا فيما يتعلق بالحذف
      $stderr.puts sprintf("لم يتم العثور على المنشور لـ %d: %s / %s", pd.post_id, pd.key, pd.value)
      next
    end

    emoji = pd.key.split('|').first
    users = JSON.parse(pd.value)
    users.each do |user|
      u = usermap[user]
      next if u.nil? # تغيير اسم المستخدم أو حذف المستخدم يترك ردود فعل يتيمة
      e = emoji
      r = DiscourseReactions::Reaction.where(post_id: p.id, reaction_type: emojiType, reaction_value: e).first_or_create
      ru = DiscourseReactions::ReactionUser.where(user_id: u.id, post_id: p.id).first
      next unless ru.nil?
      $stderr.puts sprintf("تحويل رد فعل %s إلى تفاعل %s للمستخدم %s في %s", emoji, e, user, p.url)
      DiscourseReactions::ReactionUser.create(reaction_id: r.id, user_id: u.id, post_id: p.id, created_at: pd.created_at)
    end
  end
end
  • في هذه المرحلة قمت بعمل نسخة احتياطية للموقع فقط في حالة
  • ثم قم بتشغيل migrateRetortToReactions والذي يجب أن يستغرق بعض الوقت. بالنسبة لي لم أر أو أواجه أي مشاكل. بعد تشغيل وحدة التحكم يبدو أنها تعرض جميع الكائنات المتغيرة لذا اضغط على q للخروج
  • الآن على الموقع يجب أن يكون الأمر كذلك أن البيانات تم ترحيلها بشكل صحيح
  • كخطوة أخيرة تحتاج إلى تشغيل: PostDetail.where(extra: "retort").destroy_all والذي سيحذف بيانات retort
  • الآن تمكنت من إعادة بناء موقعي بأحدث إصدار discourse وبدون إضافة retort

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

6 إعجابات