皆さん、こんにちは。
現在、Woltlab (Wbb) フォーラムを Discourse に移行するための作業を行っており、ある程度完了したら共有するつもりです。
現時点では、カテゴリ、フォーラム、ユーザー、およびそのグループを、あまり問題なく移行することに成功しています。しかし、実行中に時々、投稿やスレッドを処理しているときに「Ratelimit Exceeded」というエラーが発生し、状況が悪化します。
問題は、私がまだ比較的初心者であり、他の移行ツールから断片的な情報を集めているだけで、このメッセージがどこから来ているのか全く分からないことです。
Discourse の API から来ているのでしょうか?もしそうなら、インポート中にレート制限を無効にすることはできますか?
def migrate_threads_and_posts
puts "Migrating threads and posts..."
@client.query("SELECT * FROM wbb1_thread ORDER BY time ASC").each do |thread_row|
begin
next if thread_row[:isDeleted] == 1 || thread_row[:movedThreadID]
# lastPosterID が有効なユーザーにマッピングされていることを確認
last_post_user_id = @user_map[thread_row[:lastPosterID]] || @user_map[thread_row[:userID]]
# lastPosterID と userID が null の場合、プレースホルダーユーザーを作成
if last_post_user_id.nil? && thread_row[:lastPoster]
last_post_user_id = find_or_create_placeholder_user(thread_row[:lastPoster])
end
# 有効なユーザー ID が存在することを確認
last_post_user_id ||= User.first.id
# トピック作成者のユーザー ID を取得するか、プレースホルダーを作成
creator_user_id = @user_map[thread_row[:userID]] || find_or_create_placeholder_user(thread_row[:username]) || User.first.id
# トピックを作成
topic = Topic.new(
title: thread_row[:topic],
user_id: creator_user_id,
category_id: @forum_map[thread_row[:boardID]],
created_at: Time.at(thread_row[:time]),
updated_at: Time.at(thread_row[:lastPostTime]),
last_post_user_id: last_post_user_id
)
if topic.save(validate: false)
puts "Imported thread: #{topic.title} (ID: #{topic.id})"
# 投稿を移行
migrate_posts(thread_row[:threadID], topic.id)
else
puts "Error importing thread #{thread_row[:topic]}: #{topic.errors.full_messages.join(', ')}"
end
sleep(7) # レート制限を回避するためにスリープ時間を増やしました
rescue => e
puts "Exception importing thread #{thread_row[:topic]}: #{e.message}"
end
end
end
コードをクリーンアップし、できるだけコメントを付けました。レート制限について誰かが助けてくれることを願っています。
フォーラムでも検索してみましたが、同様の問題を抱えている人はたくさんいましたが、解決策は見つかりませんでした。もし何か見落としていたら、重複投稿をお許しください。
皆さん、ありがとうございます。