attachment_fu: не перезагружать миниатюры - PullRequest
3 голосов
/ 27 мая 2009

У меня есть хороший маленький класс "фото", к которому прикреплены изображения. Когда я перехожу на страницу, чтобы отсортировать порядок фотографий, она выполняет итерации каждой фотографии, устанавливает новое значение «сортировки» и сохраняет его. Пока все хорошо.

Проблема в том, что я заметил, что это поведение довольно медленное. Оказывается, attachment_fu перезагружает миниатюру при каждом сохранении - независимо от того, есть ли новые данные изображения для работы.

Очевидно, что эта система была хорошо продумана, поэтому мне остается только предположить, что существует положение для этой ситуации. Как я могу сказать attachment_fu не восстанавливать миниатюры, когда это не подходит?

Спасибо, - Матчу

Редактировать: Я только что вспомнил, что для этой конкретной ситуации я могу использовать update_attribute, чтобы увернуться от всех проверок и других обратных вызовов. Тем не менее, это не совсем жизнеспособный ответ на весь большой сценарий. Чего мне не хватает?

Ответы [ 2 ]

3 голосов
/ 27 мая 2009

Зашел и немного взломал attachment_fu и переписал поведение save_attachment?. В основном я добавил несколько новых условий: в дополнение к существующему временному файлу должно быть выполнено одно из следующих условий:

  1. Файл для изображения уже не существует (используется атрибут full_filename).
  2. Данные изображения были явно обновлены с использованием метода uploaded_data=.
  3. Изображение является миниатюрой.

Он проходит все три тестовых случая - новые загрузки фотографий, редактирование фотографий и редактирование данных, не относящихся к фотографиям, - но я пока еще не проверял это в условиях дикой природы. Мне, вероятно, придется сделать несколько исправлений; посмотрим что получится.

0 голосов
/ 14 июля 2009

Единственная в меру полезная тема, которую я видел по этой теме, находится здесь:

http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/709d97e06b373786

Я думаю, что решение Matchu, вероятно, является правильным с быстрым обзором кода attachment_fu. Мне бы понравилось, если бы Matchu мог поделиться патчем или фрагментом своего измененного save_attachment? метод. Я собираюсь разобраться в этом самостоятельно, так как это стало для меня проблемой, и это, вероятно, будет меньше работы, чем полная замена attachment_fu ...

Обновление

С планом Матчу я придумал короткое (но не элегантное) решение, которое, похоже, сработает после легкого тестирования.

Я изменил save_attachment? в файле attachment_fu / attachment_fu.rb:

def save_attachment?
  return false unless (thumbnail || !full_filename || @active_upload) #added
  File.file?(temp_path.to_s)
end

... чтобы проверить условия выложенного Матчу. Я не мог придумать изящный способ сказать, были ли данные переданы методу uploaded_data = setter (если у кого-то есть лучший способ сделать это, я весь в ушах; я все еще noob ruby ​​/ rails ) поэтому я также добавил строку в uploaded_data =, чтобы установить глобальную переменную @active_upload:

def uploaded_data=(file_data)
  return nil if file_data.nil? || file_data.size == 0
  self.content_type = file_data.content_type
  self.filename     = file_data.original_filename if respond_to?(:filename)
  @active_upload=true # added
  if file_data.is_a?(StringIO)
    file_data.rewind
    self.temp_data = file_data.read
  else
    self.temp_path = file_data
  end
end

Надеюсь, что это поможет, и если у кого-нибудь есть более изящный способ справиться с тем, что я там делал, с помощью глобальной переменной, я бы хотел услышать это.

...