Работа с испорченными данными, Paperclip и Rails - PullRequest
2 голосов
/ 19 июля 2011

Я пытаюсь запустить простой 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}

Но та же самая сделка. Прохождение через 23 500 объектов на S3 не шутка.

Есть более быстрые, более хитрые идеи?

Ответы [ 2 ]

1 голос
/ 19 июля 2011

Вы должны быть в состоянии получить список всех объектов в ваших корзинах S3, используя драгоценный камень aws-s3 или right-aws, в зависимости от того, что поставляется со скрепкой: http://amazon.rubyforge.org/

С этим списком вы сможете извлечь путь из каждой фотографии и сравнить массивы, чтобы увидеть, какие объекты больше не существуют на s3. Что-то вроде:

Photo.all.map{|p| p.photo.path} - bucket.objects.map(&:key)

должен получить вам объекты s3, которых ожидает скрепка, которых не существует.

Или, если вы предпочитаете злобный хакер, вы можете просто обернуть блоки внутри Paperclip.each_instance_with_attachment из https://github.com/thoughtbot/paperclip/blob/master/lib/tasks/paperclip.rake с помощью

begin

 `the code`

rescue 
 puts(instance.path, "doesn't exist") 
 next 
end 

и скопируйте файл в lib/tasks/paperclip.rake.

0 голосов
/ 19 июля 2011

В Rails 3 вы должны быть в состоянии сделать Photo.all.where(:photo => nil).

Выбор всех записей, как вы делаете в своем примере, является плохой идеей: как вы видели, это займет вечную итерациюза записи, которые вас не интересуют ...

...