لدي موقع يبدو أن مجموعة من الملفات المرفوعة قد حُذفت من جدول uploads في قاعدة البيانات، لكنها لا تزال موجودة في نظام الملفات. هذا يترك الروابط指向 هذه الملفات مكسورة. قمت بإصلاح بعضها عن طريق إعادة رفع الملفات إلى موضوع جديد لإنشاء السجل في قاعدة البيانات (في ذلك الوقت اعتقدت أن الملفات مفقودة أيضًا، لكن @angus أشار بلطف إلى السبب الذي لم أتمكن فيه من العثور عليها—في يوم ما سأسأل: لماذا نملك كلا من أسماء sha1 و base62 لكل هذه الأصول؟) ثم قمت بإعادة معالجة المنشورات التي تتضمن هذه الملفات المرفوعة، مثل هذا:
def rebake_posts_with_uploads(topic_id, post_number)
p = Post.find_by(topic_id: topic_id, post_number: post_number)
exit unless p
re = /upload:\/\/(.+?)\)/
shas= p.raw.scan(re)
shas.each do |sha|
posts = Post.where("raw like '%#{sha[0]}%'")
next unless posts
puts "Found #{posts.count - 1} #{sha[0]}"
posts.each do |post|
next if post.id == p.id
puts "rebake #{post.id}--#{BASE_URL}/t/-/#{post.topic_id}/#{post.post_number}"
post.rebake!
end
end
end
خطتي الجديدة، بما أن الملفات موجودة في نظام الملفات ولكنها غير موجودة في قاعدة البيانات، هي القيام بشيء مثل هذا:
for (all files in /shared/uploads/default/original/1x) do |file|
unless file is in uploads table
create upload record
for each post that includes that upload record
rebake
هل يبدو ذلك صحيحًا؟ أنا أراجع uploads.rake ولا أرى أي شيء يبدو أنه يفعل ذلك بالفعل. هذا إلى حد ما عكس
لكن بدلاً من FileUtils.rm(file_path) سأقوم بـ Upload.create، أعتقد.
إذا بدا هذا غبيًا حقًا أو إذا كان هناك حل أفضل بكثير، فسأحب سماعه قبل أن أغوص في هذا النفق الصغير.
شكرًا.
لا أعرف كيف حدث هذا. كنت آمل أن ألوم إضافة مخصصة، لكنني أخشى أن هذا ليس هو الحال. قد يكون ذلك مرتبطًا بمناقشة أخرى، حيث قال شخص ما: