Beh, è successo, non sono riuscito ad aggiornare discourse a causa del plugin retort.
Questo è l’errore di migrazione del database che ho ricevuto:
impossibile creare l'indice univoco "index_post_details_on_post_id_and_key_ccnew_ccnew" DETAIL: La chiave (post_id, key)=(30297, +1|retort) è duplicata.
Ho usato questo script come base per il mio codice di migrazione. Ecco cosa ho fatto.
- Per far funzionare di nuovo discourse, ho dovuto sovrascrivere la “versione” nel file template .yml con un commit di circa due settimane fa nel repository di discourse
- Ricostruisci con il plugin delle reazioni aggiunto per riportare il sito online
- Ho configurato il plugin delle reazioni con lo stesso set di reazioni di retort. Non uso alcuna reazione che possa essere interpretata come un like
- Ho usato lo script di @mcdanlj leggermente modificato con i seguenti passaggi (poiché volevo migrare tutti i retort e avevo già una mappatura 1-a-1 tra retort e reazioni):
- Esegui
./launcher enter app - Esegui
rails c - Incolla quanto segue (sembra che la console rails ripeta il codice con modifiche errate alle righe, ho aggiunto doppie interruzioni di riga ma ciò non ha realmente modificato l’output, ma se qualcuno ottiene un errore di sintassi con il codice seguente, aggiungi una riga extra dopo ogni riga):
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 non coerente rispetto all'eliminazione
$stderr.puts sprintf("Impossibile trovare il post per %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? # nome utente modificato o utente eliminato lascia Retort orfani
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("Conversione di Retort %s in Reaction %s per l'utente %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
- A questo punto ho fatto un backup del sito per sicurezza
- Quindi esegui
migrateRetortToReactionsche dovrebbe richiedere un po’ di tempo. Per me non ho visto né riscontrato problemi. Dopo l’esecuzione la console sembra mostrare tutti gli oggetti modificati, quindi premiqper uscire - Ora sul sito i dati dovrebbero essere migrati correttamente
- Come ultimo passaggio devi eseguire:
PostDetail.where(extra: "retort").destroy_allche eliminerà i dati di retort - Ora sono stato in grado di ricostruire il mio sito con l’ultima versione di discourse e senza il plugin retort
Quindi, tutto sommato, non è stato così difficile da migrare, ma è stato piuttosto spaventoso, e come discusso in precedenza, questo sovrascrive i like con le reazioni sui post che avevano sia like che retort dallo stesso utente.