Discourse Retort

好了,现在发生了,我因为 retort 插件无法更新 discourse。

这是我收到的数据库迁移错误:

无法创建唯一索引“index_post_details_on_post_id_and_key_ccnew_ccnew” DETAIL:键(post_id, key)=(30297, +1|retort) 重复。

我使用这个脚本作为我自己的迁移代码的基础。这是我所做的。

  • 为了让 discourse 再次正常工作,我不得不覆盖 .yml 文件模板中的“version”为 discourse 仓库中大约两周前的提交。
  • 使用 reactions 插件重建以恢复站点。
  • 我将 reactions 插件配置为与 retort 相同的反应集。我不使用任何可能被解释为“喜欢”的反应。
  • 我修改了 @mcdanlj 的脚本,并执行了以下步骤(因为我想迁移所有 retort,并且我已经在一对一地映射 retort 和反应):
  • 运行 ./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? # 用户名已更改或已删除用户留下孤立的 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("将用户 %s 在 %s 中的 Retort %s 转换为 Reaction %s", user, p.url, emoji, e)
      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 插件来重建我的站点。

总而言之,迁移并不那么困难,但它相当吓人,并且如前所述,这会将同一用户在帖子上的点赞(likes)与反应(reactions)覆盖掉。

6 个赞