Paperclip生成S3的URL速度较慢问题

12

我们正在尝试优化我们的视图,在一个加载了40张图片的页面上,使用以下代码:

= image_tag(product.pictures.first.data.url(:gallery))
我们的加载时间为840毫秒,如果我们将其更改为以下代码:
= image_tag("http://bucketname.s3.amazonaws.com/products/#{product.pictures.first.id}/gallery.jpg?1325844462"

我们的加载时间达到了220毫秒。

这意味着s3_path_url的插值非常慢。还有其他人遇到同样的问题吗?目前我创建了一个帮助程序来生成我的url:

def picture_url(picture, style)
  "http://bucketname.s3.amazonaws.com/products/#{picture.id}/#{style}.jpg"
end

我在这里唯一的问题是缓存键和扩展名都不见了。


你能找到解决方案吗?我们遇到了同样的问题。我们使用过期的URL,所以不能像你那样硬编码它。 - neebz
@nEEbz 目前我们还没有找到任何解决方案。我们现在使用自定义助手生成URL,效果更流畅。 - SteenhouwerD
我也遇到了同样的问题。现在我也使用辅助函数来生成我的URL。 - Matt
分页与显示更多按钮? - DickieBoy
这个页面上每个产品是否总是只显示一个图像? - Mik
我的猜测是问题出在每个运行的SQL查询上。在第一种情况下,您正在执行product.pictures.first,这将发生40次,因此可能会有n+1个查询,而在第二种情况下,您直接传递图片并可能更有效地加载它。当然,这只是我的猜测,还取决于您代码的其他部分。 - Rahul
1个回答

0

在图库页面上,每个产品是否总是只显示一个图片?

你的数据库中可以加入一个缓存列。每当你创建或更新一张图片时,你可以将它的图片网址保存为“gallery_picture_url”,然后直接调用。

= image_tag(product.gallery_picture_url)

class Product < ActiveRecord::Base
  after_commit: :update_gallery_picture_url

  def update_gallery_picture_url
    self.update(gallery_picture_url: self.pictures.first.data.url(:gallery)) if self.gallery_picture_present?
  end

  def gallery_picture_present?
    (self.pictures.first.data.url(:gallery) rescue false).present?
  end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接