Rails のスクリプトで投稿のセットを更新しようとしています。しかし、奇妙なオフ・バイ・ワン(off-by-one)の挙動があり、ある投稿が前の投稿の値で更新されてしまうようです。
これらの更新をすべて post.raw.gsub() に直接変更して、内側ループ内の投稿(以前はトピック投稿から値を取得していたもの)でのこの問題を「解決」しようとしましたが、今度はトピック N のトピック投稿が、トピック N-1 の前の最終投稿の raw で更新されてしまいます。
さらに混乱しています。最初の(つまりトピック)投稿が、tpost.raw.gsub! で、前の反復からの post.raw.gsub!(preg, "#{$2}") の値で更新されてしまうのです。
編集:最後のバージョンで何が間違っていたのか結局わかりませんでしたが、リビジョンを作成する「一部の投稿を更新する」スクリプトのバージョンを以下に示します。
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