Bueno, finalmente sucedió, no pude actualizar discourse debido al plugin retort.
Este es el error de migración de base de datos que obtuve:
no se pudo crear el índice único "index_post_details_on_post_id_and_key_ccnew_ccnew" DETAIL: La clave (post_id, key)=(30297, +1|retort) está duplicada.
Utilicé este script como base para mi propio código de migración. Esto es lo que hice.
- Para que discourse volviera a funcionar, tuve que anular la “versión” en el archivo de plantilla .yml a un commit de hace aproximadamente dos semanas en el repositorio de discourse.
- Reconstruí con el plugin de reacciones añadido para que el sitio volviera a funcionar.
- Configuré el plugin de reacciones con el mismo conjunto de reacciones que retort. No utilizo ninguna reacción que pueda interpretarse como “me gusta”.
- Utilicé el script de @mcdanlj un poco modificado con los siguientes pasos (ya que quería migrar todos los retort y ya tenía un mapeo de 1 a 1 entre retort y reacciones):
- Ejecutar
./launcher enter app - Ejecutar
rails c - Pegar lo siguiente (parece que la consola de rails repetirá el código con cambios de línea incorrectos, añadí dobles saltos de línea pero eso no cambió realmente la salida, pero si alguien obtiene un error de sintaxis con el siguiente código, añada un salto de línea adicional después de cada línea):
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 no es consistente con respecto a la eliminación
$stderr.puts sprintf("No se pudo encontrar la publicación para %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? # el nombre de usuario cambiado o el usuario eliminado deja Retorts huérfanos
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("Convirtiendo Retort %s a Reacción %s para el usuario %s en %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
- En este punto hice una copia de seguridad del sitio por si acaso.
- Luego ejecute
migrateRetortToReactionsque debería tardar un tiempo. En mi caso, no vi ni me encontré con ningún problema. Después de ejecutarlo, la consola parece mostrar todos los objetos cambiados, así que presioneqpara salir. - Ahora en el sitio debería ser el caso de que los datos se migren correctamente.
- Como paso final, debe ejecutar:
PostDetail.where(extra: "retort").destroy_allque eliminará los datos de retort. - Ahora pude reconstruir mi sitio con la última versión de discourse y sin el plugin retort.
En resumen, no es tan difícil de migrar, pero fue bastante aterrador, y como se discutió anteriormente, esto sobrescribe los “me gusta” con reacciones en las publicaciones que tenían tanto “me gusta” como “retorts” por el mismo usuario.