3

我有一个不错的小“照片”类,附有图像。当我转到页面对照片的顺序进行排序时,它会遍历每张照片,设置新的“排序”值并保存它。到目前为止一切都很好。

问题是,我注意到这种行为相当缓慢。事实证明,attachment_fu 会在每次保存时重新加载缩略图 - 无论是否有新的图像数据可供使用。

显然,这个系统是经过深思熟虑的,所以我只能假设存在针对这种情况的规定。我如何告诉 attachment_fu 在不合适的时候不要重新生成缩略图?

谢谢,--Matchu

编辑:我只记得,对于这种特殊情况,我可以使用 update_attribute 来躲避所有验证和其他回调。然而,对于整个大场景,这并不是一个真正可行的答案。我错过了什么?

4

2 回答 2

3

进去并破解了 attachment_fu ,并重写了save_attachment?行为。几乎,我添加了一些新条件:除了存在临时文件之外,以下条件之一必须为真:

  1. 图像的文件不存在(使用full_filename属性)。
  2. 使用该uploaded_data=方法显式更新图像数据。
  3. 图像是缩略图。

它通过了所有三个测试用例——新照片上传、编辑照片图像和编辑非图像照片数据——但我还没有真正在野外测试过。我可能需要做一些修复;我们会看看会发生什么。

于 2009-05-27T03:31:46.660 回答
0

我在这个主题上看到的唯一一个适度有用的线程是在这里:

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

我认为 Matchu 的解决方案可能是正确的,只需快速查看 attachment_fu 代码即可。如果 Matchu 可以分享他修改后的 save_attachment 的补丁或片段,我会很高兴?方法。我将自己深入研究这个问题,因为这对我来说已经成为一个问题,而且它可能比完全替换 attachment_fu 工作更少......

更新

根据 Matchu 的大纲,我想出了一个简短(如果不优雅)的解决方案,在经过轻度测试后似乎可以工作。

我修改了 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

...检查Matchu制定的条件。我想不出一种优雅的方式来判断数据是否已传递给 upload_data=setter 方法(如果有人有更好的方法来做到这一点,我全神贯注;我仍然是 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

希望这会有所帮助,如果有人有更优雅的方式来处理我在全局变量中所做的事情,我很想听听。

于 2009-07-13T20:31:09.120 回答