在rails中使用carrierwave生成图像URL

时间:2013-09-23 03:54:36

标签: ruby-on-rails-4 carrierwave

这与我关于加入here的问题有些关联。默认情况下,当我在搜索结果视图中使用listing.image.name时,它会执行完整查询以查找结果数组中每个列表的图像。它甚至会进行额外的查询,以检查列表是否有任何图像。所以为了避免这种情况,我将以下内容添加到Thinking Sphinx查询中:

@ts_params[:sql][:joins] = "INNER JOIN listing_images ON listing_images.listing_id = listings.id AND listing_images.position = 0"
@ts_params[:sql][:select] = "listings.*, listing_images.image as image_name, listing_images.id as image_id"

这有效,但是我不知道如何使用carrierwave生成完整的image_url。以前,每个结果都在进行额外的查询,我使用的是listing.image.image_url(:sizename)。所以,我可以从上面的连接中找到图像名称和ID,但是如何通过carrierwave将其转换为完整的图像网址?是否有内置方法来检索网址,不需要“图片”对象?

我尝试了listing.image_id.image_url(:sizename),但是它提供了一个未定义的方法错误。

2 个答案:

答案 0 :(得分:1)

从carrierwave的角度来看,答案是显而易见的:

user.avatar.url
user.avatar.thumbnail.url

此处,user是模型的实例,avatar是模型上调用mount_uploader的字段。在你的情况下,这将是:

listing_image.image_name.url
listing_image.image_name.thumbnail.url

但这可能不起作用,因为看起来你可能正在将listing_image字段加载到Listing中而不是通过includes(或可怕的N + 1非渴望加载)。在此之前,您可能需要解决其他堆栈溢出问题。

修改

根据我们对your other issue的讨论,一旦你有一个has_one :main_image只有你想要的一个ListingImage,你就会使用类似@listing.main_image.image_name.url的东西,如果你有的话名为“thumbnail”的版本,@listing.main_image.image_name.thumbnail.url

答案 1 :(得分:0)

当我使用查询来获取图像时,我想使用db字段来构建图像url,而不是对每个图像发出完整的sql查询。我遇到了类似的问题。

我发现,如果我们有三个字段id, updated_at and image_name,则可以从相关图像表中获取几个字段来构建不会为图像运行任何sql的图像,该字段应来自保存图像的表。可能是从主表中将图像另存为单独的列,也可能是完全分开的表,专门用于图像,这是示例代码

根据您的选择,它可以位于您的助手或装饰器中

  def logo_url(id, updated_at, name)
    return if id.blank? || updated_at.blank? || name.blank? 

    Company.new(id: id, updated_at: updated_at, logo: name).logo
  end

在视图中,您可以将该助手方法称为

<%= logo_url(company.id, company.updated_at, company.logo).url %>

这样,您可以在不对每个图像执行sql查询的情况下,将图像包含url。