2

这与我关于 joins 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 将其转换为完整的图像 url?是否有不需要“图像”对象的内置方法来检索 url?

我尝试了 listing.image_id.image_url(:sizename) 但它给出了一个未定义的方法错误,正如预期的那样。

4

2 回答 2

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 字段加载到列表中,而不是通过包含(或可怕的 N+1 非急切加载)。您可能需要先解决您的其他 stackoverflow 问题,然后才能解决这个问题。

编辑:

根据我们对您的另一个问题的讨论,一旦您获得了has_one :main_image您想要的一个 ListingImage,您将使用类似的东西@listing.main_image.image_name.url,如果您有一个名为“thumbnail”的版本,@listing.main_image.image_name.thumbnail.url.

于 2013-09-25T14:11:03.710 回答
0

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

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

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

  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 的图像。

于 2020-05-20T08:28:35.163 回答