anexo_fu:Não recarregue miniaturas
-
06-09-2019 - |
Pergunta
Eu tenho uma pequena aula de "fotos" que contém imagens anexadas.Quando vou para a página para classificar a ordem das fotos, ela percorre cada foto, define o novo valor de "classificação" e salva-a.Tudo bem até agora.
O problema é que notei que esse comportamento é bastante lento.Acontece que attachment_fu recarrega a miniatura a cada salvamento - independentemente de haver ou não novos dados de imagem para trabalhar.
Obviamente que este sistema foi bem pensado, pelo que só me resta assumir que existe uma disposição para esta situação.Como posso dizer ao attachment_fu para não regenerar as miniaturas quando não for apropriado?
Obrigado, --Matchu
Editar: Acabei de lembrar que, para esta situação específica, posso usar update_attribute para evitar todas as validações e outros retornos de chamada.No entanto, esta não é realmente uma resposta viável para todo o grande cenário.o que estou perdendo?
Solução
Entrou e hackeado um pouco e reescrever o save_attachment?
comportamento. Praticamente, adicionei algumas novas condições: além de um arquivo temporário existente, um dos seguintes deve ser verdadeiro:
- Nenhum arquivo para a imagem já existe (usando o
full_filename
atributo). - Os dados da imagem foram explicitamente atualizados usando o
uploaded_data=
método. - A imagem é uma miniatura.
Ele passa todos os três casos de teste - novos uploads de fotos, editar imagens fotográficas e editar dados de fotos não imagens - mas ainda não testei isso na natureza. Provavelmente terei que fazer algumas correções; veremos o que acontece.
Outras dicas
O único tópico moderadamente útil que vi sobre este tópico está aqui:
http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/709d97e06b373786
Acho que a solução do Matchu é provavelmente a correta com uma rápida revisão do código attachment_fu.Eu adoraria se Matchu pudesse compartilhar um patch ou um trecho de seu save_attachment modificado?método.Estou prestes a investigar isso sozinho, já que isso se tornou um problema para mim e provavelmente será menos trabalhoso do que substituir completamente o attachment_fu...
Atualizar
Com o esboço do Matchu, criei uma solução curta (embora deselegante) que parece funcionar após testes leves.
Eu modifiquei save_attachment?em attachment_fu/attachment_fu.rb:
def save_attachment?
return false unless (thumbnail || !full_filename || @active_upload) #added
File.file?(temp_path.to_s)
end
...para verificar as condições estabelecidas por Matchu.Não consegui encontrar uma maneira elegante de saber se os dados foram repassados para o método setter uploaded_data= (se alguém tiver uma maneira melhor de fazer isso, sou todo ouvidos;Ainda sou um novato em Ruby/Rails), então também adicionei uma linha a uploaded_data= para definir a variável global @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
Espero que ajude, e se alguém tiver uma maneira mais elegante de lidar com o que fiz lá com a variável global, adoraria ouvir.