从数据库渲染图像时,如何进行一次数据库调用而不是两次?

时间:2018-01-18 17:23:53

标签: ruby-on-rails database image ruby-on-rails-5

我正在使用Rails 5.我有一个模型(带有基础PostGres数据库)和一些基本数据列

 name         | character varying           |
 image        | bytea                       | not null
 content_type | character varying           | not null

"图像"是我想要显示的图像的二进制数据。我想创建一个页面来显示图像和名称,但我无法在没有多个数据库调用的情况下弄清楚如何执行此操作。我的节目视图看起来像

<h1>Votes#show</h1>
<h2><%= @person.name %></h2>
<img src="<%= url_for(:controller => "people",
                      :action => "image",
                      :id => @person.id) %>" />

如您所见,为了渲染图像,我必须调用一个单独的控制器方法。显示此节目页面的方法是

  def show
    id = params[:id]
    ...
        @person = Person.find_by_id(id)
  end

和发送图像数据的控制器方法是

  def image
    @person = Person.find(params[:id])
    send_data(@person.image,
                :filename => @person.name,
                :type => @person.content_type,
                :disposition => "inline")
  end

有谁知道如何简化我的视图,以便我只需要调用一个数据库调用来获取我的数据而不是两个?

2 个答案:

答案 0 :(得分:0)

你能不能这样做吗?:

gulp.task("generate-service-worker", function(callback) {
    swPrecache.write(path.join(outputDir, "service-worker.js"), {
        staticFileGlobs: [
            outputDir + "**/*.{js,html,json,css,png,jpg,gif,svg,eot,svg,ttf,woff,woff2}"],
        importScripts: ["push.js"],
        navigateFallback: ["index.html"],
        stripPrefix: outputDir
    }, callback);
});

答案 1 :(得分:0)

为什么不发送对象(你已经找到它)而不是发回id?对ruby来说有点新,所以不确定这在技术上是否正确,但似乎你可以做到:

<img src="<%= url_for(:controller => "people",
                      :action => "image",
                      :id => @person) %>" />

在控制器中只使用@person对象而不是再次查找它。可能也想将id重命名为人或某事。