Nun, es ist passiert, ich konnte Discourse wegen des Retort-Plugins nicht aktualisieren.
Dies ist der Datenbankmigrationsfehler, den ich erhalten habe:
could not create unique index "index_post_details_on_post_id_and_key_ccnew_ccnew" DETAIL: Key (post_id, key)=(30297, +1|retort) is duplicated.
Ich habe dieses Skript als Basis für meinen eigenen Migrationscode verwendet. Hier ist, was ich getan habe.
- Um Discourse wieder zum Laufen zu bringen, musste ich die “version” in der Template-.yml-Datei auf einen Commit aus dem Discourse-Repository vor etwa zwei Wochen überschreiben.
- Erneut erstellen mit dem hinzugefügten Reactions-Plugin, um die Seite wieder hochzufahren.
- Ich habe das Reactions-Plugin mit denselben Reaktionen wie Retort konfiguriert. Ich verwende keine Reaktion, die als “Like” interpretiert werden könnte.
- Ich habe das Skript von @mcdanlj etwas modifiziert mit den folgenden Schritten (da ich alle Retorts migrieren wollte und bereits eine 1:1-Zuordnung zwischen Retorts und Reaktionen hatte):
- Führen Sie
./launcher enter appaus. - Führen Sie
rails caus. - Fügen Sie Folgendes ein (es scheint, dass die Rails-Konsole den Code mit falschen Zeilenänderungen zurückgibt. Ich habe doppelte Zeilenumbrüche hinzugefügt, aber das hat die Ausgabe nicht wirklich geändert. Wenn jemand jedoch einen Syntaxfehler mit dem folgenden Code erhält, fügen Sie nach jeder Zeile einen zusätzlichen Zeilenumbruch hinzu):
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 ist nicht konsistent bezüglich Löschung
$stderr.puts sprintf("Konnte Post für %d nicht finden: %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? # Geänderter Benutzername oder gelöschter Benutzer hinterlässt verwaiste Retorts
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("Konvertiere Retort %s zu Reaction %s für Benutzer %s in %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
- An diesem Punkt habe ich vorsichtshalber ein Website-Backup erstellt.
- Führen Sie dann
migrateRetortToReactionsaus, was eine Weile dauern sollte. Bei mir habe ich keine Probleme gesehen oder erlebt. Nach der Ausführung scheint die Konsole alle geänderten Objekte anzuzeigen. Drücken Sie alsoq, um zu beenden. - Jetzt sollte es auf der Website so sein, dass die Daten korrekt migriert wurden.
- Als letzten Schritt müssen Sie Folgendes ausführen:
PostDetail.where(extra: "retort").destroy_all, wodurch die Retort-Daten gelöscht werden. - Jetzt konnte ich meine Seite mit der neuesten Discourse-Version und ohne das Retort-Plugin neu erstellen.
Alles in allem nicht so schwierig zu migrieren, aber es war ziemlich beängstigend, und wie bereits besprochen, überschreibt dies Likes mit Reaktionen auf Posts, die sowohl Likes als auch Retorts vom selben Benutzer hatten.