Eh bien, c’est arrivé, je n’ai pas pu mettre à jour discourse à cause du plugin retort.
Voici l’erreur de migration de base de données que j’ai obtenue :
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.
J’ai utilisé ce script comme base pour mon propre code de migration. Voici ce que j’ai fait.
- Pour que discourse fonctionne à nouveau, j’ai dû remplacer la « version » dans le fichier modèle .yml par un commit d’il y a environ deux semaines dans le dépôt discourse.
- Reconstruire avec le plugin de réactions ajouté pour remettre le site en ligne.
- J’ai configuré le plugin de réactions avec le même ensemble de réactions que retort. Je n’utilise aucune réaction qui pourrait être interprétée comme un like.
- J’ai utilisé le script de @mcdanlj légèrement modifié avec les étapes suivantes (car je voulais migrer tous les retorts et j’avais déjà un mappage 1-à-1 entre les retorts et les réactions) :
- Exécuter
./launcher enter app - Exécuter
rails c - Coller ce qui suit (il semble que la console rails renverra le code avec des changements de ligne incorrects, j’ai ajouté des doubles changements de ligne mais cela n’a pas vraiment changé la sortie, mais si quelqu’un obtient une erreur de syntaxe avec le code suivant, ajoutez une ligne supplémentaire après chaque ligne) :
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 not consistent WRT delete
$stderr.puts sprintf("Could not find post for %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? # changed user name or deleted user leaves orphaned 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("Converting Retort %s to Reaction %s for user %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
- À ce stade, j’ai effectué une sauvegarde du site au cas où.
- Ensuite, exécutez
migrateRetortToReactionsqui devrait prendre un certain temps. Pour moi, je n’ai vu ni rencontré de problèmes. Après avoir exécuté la console, il semble qu’elle affiche tous les objets modifiés, alors appuyez surqpour quitter. - Maintenant, sur le site, les données devraient être migrées correctement.
- Comme étape finale, vous devez exécuter :
PostDetail.where(extra: "retort").destroy_allqui supprimera les données de retort. - Maintenant, j’ai pu reconstruire mon site avec la dernière version de discourse et sans le plugin retort.
Donc, dans l’ensemble, pas si difficile à migrer, mais c’était assez effrayant, et comme discuté précédemment, cela écrase les likes par des réactions sur les posts qui avaient à la fois des likes et des retorts par le même utilisateur.