【问题标题】:Rendering view with download link files using rails and dropbox使用 Rails 和 Dropbox 渲染带有下载链接文件的视图
【发布时间】:2015-08-26 03:24:27
【问题描述】:

我是 RoR 的新手,遇到了一些问题,希望你们能帮助我。

在控制器中:

def process
   @order = Order.includes({folders: :document}, {folders: :service}).find(params[:order_id])
end

在视图中:

-@order.folders.each do |folder|

  p
        b one: 
        | #{folder.service[:title]}_#{folder.service[:description]}_# {folder.service[:ink]}          

        b two:  
        | #{folder[:amount]}

  h3 three
  ==@order.folders[0][:description]

  h3 four
  -@order.folders[0].document.each do |document|
        a[href= "#{document.file.url(download: true)}"] #{document[:file_file_name]}

这“很好”。它完美地显示了下载链接,但视图的呈现需要很长时间。

这是带有 2 个链接文件的日志:

Started GET "/orders/ver_detalles?order_id=297" for 127.0.0.1 at 2015-08-25 22:17:42 -0430
Processing by OrdersController#ver_detalles as JS
  Parameters: {"order_id"=>"297"}`enter code here`
  [1m[36mUser Load (0.0ms)[0m  [1mSELECT  `users`.* FROM `users` WHERE `users`.`id` = 9  ORDER BY `users`.`id` ASC LIMIT 1[0m
  [1m[35mOrder Exists (0.0ms)[0m  SELECT  1 AS one FROM `orders` WHERE `orders`.`id` = 297 LIMIT 1
  [1m[36mOrder Load (0.0ms)[0m  [1mSELECT  `orders`.* FROM `orders` WHERE `orders`.`id` = 297 LIMIT 1[0m
  [1m[35mFolder Load (0.0ms)[0m  SELECT `folders`.* FROM `folders` WHERE `folders`.`order_id` IN (297)
  [1m[36mDocument Load (0.0ms)[0m  [1mSELECT `documents`.* FROM `documents` WHERE `documents`.`folder_id` IN (326)[0m
  [1m[35mService Load (0.0ms)[0m  SELECT `services`.* FROM `services` WHERE `services`.`id` IN (1)
  Rendered partials/_detallesOrden.html.slim (4703.1ms)
  Rendered orders/ver_detalles.js.erb (4718.8ms)
Completed 200 OK in 4750ms (Views: 4734.4ms | ActiveRecord: 0.0ms)

这是包含 4 个链接文件的日志:

Started GET "/orders/ver_detalles?order_id=303" for 127.0.0.1 at 2015-08-25 22:13:31 -0430
Processing by OrdersController#ver_detalles as JS
  Parameters: {"order_id"=>"303"}
  [1m[36mUser Load (0.0ms)[0m  [1mSELECT  `users`.* FROM `users` WHERE `users`.`id` = 9  ORDER BY `users`.`id` ASC LIMIT 1[0m
  [1m[35mOrder Exists (15.6ms)[0m  SELECT  1 AS one FROM `orders` WHERE `orders`.`id` = 303 LIMIT 1
  [1m[36mOrder Load (0.0ms)[0m  [1mSELECT  `orders`.* FROM `orders` WHERE `orders`.`id` = 303 LIMIT 1[0m
  [1m[35mFolder Load (0.0ms)[0m  SELECT `folders`.* FROM `folders` WHERE `folders`.`order_id` IN (303)
  [1m[36mDocument Load (0.0ms)[0m  [1mSELECT `documents`.* FROM `documents` WHERE `documents`.`folder_id` IN (332, 333)[0m
  [1m[35mService Load (0.0ms)[0m  SELECT `services`.* FROM `services` WHERE `services`.`id` IN (7, 4)
  Rendered partials/_detallesOrden.html.slim (8453.1ms)
  Rendered orders/ver_detalles.js.erb (8453.1ms)
Completed 200 OK in 8500ms (Views: 8484.4ms | ActiveRecord: 15.6ms)

因此,当查询返回更多文件时,渲染需要更多时间。如果我在视图中注释最后一行,则渲染只需要 60 毫秒。我该如何解决这个问题?

【问题讨论】:

    标签: ruby-on-rails rendering dropbox link-to


    【解决方案1】:

    首先,您可以使用以下语法将它们包含在这种关联中:

        def process
           @order = Order.includes(folders: [:document, :service]).find(params[:order_id])
        end
    

    看起来您的部分人员正在做一些繁重的工作,并且他们花费了大部分时间来完成请求:

      Rendered partials/_detallesOrden.html.slim (8453.1ms)
      Rendered orders/ver_detalles.js.erb (8453.1ms)
    

    这会导致@order.folders[0].document.each 循环中每一行的部分加载开销。因此,文档越大,渲染视图所需的时间就越长。

    如果您可以在部分中使用,我建议您寻找像 fragment caching 这样的缓存策略。这将为您节省大量时间和开销。

    【讨论】:

    • 您好,感谢您的回答。我尝试了片段缓存,但还是一样,视图在渲染中需要很长时间。
    • 如果您循环浏览大量文件,则需要时间。因此,您必须想出一些替代方案,看看如何最大限度地减少视图中的繁重工作,例如,寻找是否可以将视图拆分为多个部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 2023-03-05
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多