使用导轨中的载波生成图像url

问题描述 投票:1回答:2

这与我有关联接here的问题有些相关。默认情况下,当我在搜索结果视图中使用listing.image.name时,它将执行完整查询以查找结果数组中每个列表的图像。它甚至会做一个额外的查询,只是检查清单中是否有任何图像。因此,为避免这种情况,我在我的Think 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"

这有效,但是我不确定如何使用载波生成完整的image_url。以前,它对每个结果进行额外的查询时,我使用的是listing.image.image_url(:sizename)。因此,我可以从上面的联接中找到图像名称和ID,但是如何通过载波将其转换为完整的图像URL?是否有不需要URL的内置方法来检索“图像”对象?

我尝试了listing.image_id.image_url(:sizename),但按预期提供了未定义的方法错误。

ruby-on-rails-4 carrierwave
2个回答
1
投票

从载波的角度看,答案很明显:

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

[这里,用户是模型的实例,并且化身是模型上带有mount_uploader的字段。在您的情况下,它将类似于:

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

不过,这可能不起作用,因为看起来您可能正在将Listing_image字段加载到列表中,而不是通过包含(或可怕的N + 1非渴望加载)。您可能需要先解决其他stackoverflow问题,然后才能解决此问题。

编辑:

根据我们对your other issue的讨论,一旦您想要的一个ListingImage有了一个has_one :main_image,您将使用类似@listing.main_image.image_name.url的名称,并且,如果您有一个名为“ thumbnail”的版本, @listing.main_image.image_name.thumbnail.url


0
投票

当我使用查询来获取图像时,我想使用数据库字段来构建图像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。

© www.soinside.com 2019 - 2024. All rights reserved.