حسنًا، لقد حدث ذلك الآن، لم أتمكن من تحديث 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
لذا في المجمل، ليس من الصعب جدًا الترحيل ولكنه كان مخيفًا جدًا، وكما نوقش سابقًا، هذا يحل محل الإعجابات بالتفاعلات على المشاركات التي كان لديها كل من الإعجابات وردود الفعل من نفس المستخدم.