这与我有关联接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),但按预期提供了未定义的方法错误。
从载波的角度看,答案很明显:
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
。
当我使用查询来获取图像时,我想使用数据库字段来构建图像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。