تمكنت بطريقة ما من جعل دالة السكريبت تعمل بشكل صحيح.
إليك التغييرات التي أجريتها (بمساعدة بسيطة من Claude Code
)
=>mongo.rb
def posts(offset = 0, page_size = 1000)
post_keys = mongo.find(_key: "posts:pid").skip(offset).limit(page_size).pluck(:value)
post_keys
.map { |pid| post(pid) }
.compact # <-- يسقط أي نتائج فارغة (معرفات المنشورات اليتيمة)
post_keys.map { |post_key| post(post_key) }
end
def post(id)
post = mongo.find(_key: "post:#{id}").first
return nil if post.nil? # <-- التحقق من القيمة الفارغة
post["timestamp"] = timestamp_to_date(post["timestamp"])
if post["upvoted_by"] = mongo.find(_key: "pid:#{id}:upvote").first
post["upvoted_by"] = mongo.find(_key: "pid:#{id}:upvote").first[:members]
else
post["upvoted_by"] = []
end
post["pid"] = post["pid"].to_s
post["deleted"] = post["deleted"].to_s
post
end
=>nodebb.rb
create_posts(posts, total: post_count, offset: offset) do |post|
# تخطي إذا كان المنشور فارغًا
# تخطي إذا كان merged_post
next if post.nil?
next if @merged_posts_map[post["pid"]]
# تخطي إذا كان محذوفًا
next if post["deleted"] == "1"
raw = post["content"]
post_id = "p#{post["pid"]}"
next if raw.blank?
topic = topic_lookup_from_imported_post_id("t#{post["tid"]}")
unless topic
puts "Topic with id #{post["tid"]} not found, skipping"
next
end
يبدو أنه يعمل بالطريقة الصحيحة الآن.
على الرغم من أنني لا أعرف مدى صحة هذا من وجهة نظر البنية الداخلية لـ Discourse، إلا أنه يبدو أنه يعمل للوهلة الأولى.
أي اقتراحات للتحسين والتحسين هي موضع ترحيب كبير.