Seltsamer Off-by-one-Fehler nach dem Update

Ich versuche, eine Reihe von Beiträgen in einem Rails-Skript zu aktualisieren. Es scheint ein seltsames Off-by-One-Verhalten zu geben, bei dem ein Beitrag mit dem Wert des vorherigen Beitrags aktualisiert wird.

Ich habe alle diese Updates direkt auf post.raw.gsub() verschoben, um dieses Problem für die Beiträge innerhalb der inneren Schleife zu „lösen" (die zuvor den Wert vom Themenbeitrag bezogen hatten), aber nun wird der Themenbeitrag von Thema N mit dem Raw-Wert des vorherigen letzten Beitrags aus Thema N-1 aktualisiert.

Ich bin jetzt noch verwirrter, da der erste (d. h. Themen-)Beitrag mit tpost.raw.gsub! mit dem Wert von post.raw.gsub!(preg, "#{$2}") aus der vorherigen Iteration aktualisiert wird.

EDIT: Nun, ich habe nie herausgefunden, was bei der letzten Version schiefgelaufen ist, aber hier ist eine Version eines Skripts zum Aktualisieren einiger Beiträge, das eine Revision erstellt:

def fix_slack_posts
  opts = { bypass_rate_limiter: true, bypass_bump: true, skip_validations: true }
  reg=/(\\*\\*)(This topic was automatically generated from Slack. You can find the original thread \\[here\\].+?\\))(\\*\\*\\.)?\\s*?([a-zA-Z, ()]* : )(.*)/m
  preg = /([a-zA-Z, ()]+? : )(.*)/m
  topic_posts = Post.where("raw like '**This topic was automatically%'")
  #topic_posts = Post.where(topic_id: [23934, 23935], post_number: 1)
  topic_posts.each do |tpost|
    begin
      puts "Fixing topic post #{tpost.id} with #{tpost.raw[0..30]}"
      puts tpost.raw.gsub(reg,"1 #{$1}\\n2 #{$2}\\n3 #{$3}\\n4 #{$4}\\n 5 #{$5}")
      raw = tpost.raw.gsub(reg,"#{$5}\\n\\n#{$2}.")
      puts "Fixing topic post #{tpost.id} with #{tpost.raw[0..30]}\\n---\u003e#{raw}"
      user = User.find(tpost.user_id)
      if raw.length \u003e 10
        tpost.revise(user,{raw: raw,edit_reason: 'fix slack link location'}, opts)
      end
    rescue
      puts "Can't update topic post #{tpost.raw}"
    end
    posts = Post.where(topic_id: tpost.topic_id).where("post_number \u003e 1")
    posts.each do |post|
      if post.raw.gsub(preg,"#{$2}").length\u003e=10
        begin
          puts "Fixing post #{post.id} with #{post.raw[0..30]}"
          raw = post.raw.gsub(preg,"#{$2}")
          user = User.find(post.user_id)
          post.revise(user,{raw: raw,edit_reason: 'remove user name from text'}, opts)
        rescue
          puts "#{post.id}--cannot save #{post.raw}. "
        end
      end
    end
  end
end