【问题标题】:Generating image url using carrierwave in rails在rails中使用carrierwave生成图片url
【发布时间】:2013-09-23 03:54:35
【问题描述】:

这与我关于加入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"

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

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

【问题讨论】:

  • 我已经设法手动输入网址,s3urlhere/uploads/listing_image/image/#{listing.image_id}/medium_#{listing.image_name}", :alt => 列表。标题 %> - 肯定有办法使用carrierwave 构建这个网址?

标签: ruby-on-rails-4 carrierwave


【解决方案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 问题,然后才能解决这个问题。

编辑:

根据我们在your other issue 上的讨论,一旦您获得了您想要的一个列表图像的has_one :main_image,您将使用@listing.main_image.image_name.url 之类的东西,如果您有一个名为“thumbnail”的版本, @listing.main_image.image_name.thumbnail.url.

【讨论】:

  • 好的,我可能最终会根据您在上一个问题中的回答使用急切加载 - 但肯定最好尽可能使用连接,因为它可以保存查询?
  • Per the docs, includes,我们在另一个线程中讨论过,使用“最小可能的查询数”。在实践中,我发现它更喜欢廉价的额外查询(但不是 N 个查询)而不是巨大的、昂贵的连接。如果您看到 includes 执行了 N 个额外的查询,这可能是一种奇怪的互动,与值得向该 gem 的作者报告的思考狮身人面像的互动。
【解决方案2】:

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

我发现通过从相关图像表中提取的几个字段,我们可以构建图像,如果我们有三个字段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 的图片。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-31
    • 2017-03-02
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    相关资源
    最近更新 更多