我正在尝试运行一个简单的rake paperclip:refresh class=Photo
,但是有一些破损的数据,或者一张不存在的照片,它会导致这种反应:
...................................................rake aborted!
The specified key does not exist.
假设错误是由S3上没有的照片引起的。在一堆23,500件物品中铲除罪魁祸首的最佳方法是什么?
到目前为止,我已尝试过这些命令......
Photo.all.select{|p|!p.photo.exists?}
但是这已经持续了15分钟......可能已经陷入困境,但是不能让我的笔记本电脑风扇强烈嗡嗡作响。
我也试过..
Photo.all.select{|p|!p.photo}
但同样的交易。在S3上通过23,500个对象生根不是开玩笑。
任何更快,更狡猾的想法?
答案 0 :(得分:1)
您应该能够使用aws-s3或右aws gem获取S3存储桶中所有对象的列表,无论哪个附带回形针:http://amazon.rubyforge.org/
使用该列表,您应该能够从每个Photo中获取路径并比较数组以查看s3上不再存在哪些对象。类似的东西:
Photo.all.map{|p| p.photo.path} - bucket.objects.map(&:key)
应该得到回形针预期不存在的s3对象。
或者,如果你更喜欢邪恶的hackery,你可以用{/ 3}} Paperclip.each_instance_with_attachment
包围块
begin
`the code`
rescue
puts(instance.path, "doesn't exist")
next
end
并将文件复制到lib/tasks/paperclip.rake
。
答案 1 :(得分:0)
在Rails 3中,您应该能够Photo.all.where(:photo => nil)
。
在您的示例中选择所有记录是一个坏主意:正如您所见,它将永远迭代您不感兴趣的记录......