处理损坏的数据,Paperclip和Rails

时间:2011-07-19 13:43:12

标签: ruby-on-rails console amazon-s3 paperclip

我正在尝试运行一个简单的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个对象生根不是开玩笑。

任何更快,更狡猾的想法?

2 个答案:

答案 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)

在您的示例中选择所有记录是一个坏主意:正如您所见,它将永远迭代您不感兴趣的记录......