2015-08-26 4 views
0

Я любопытный в RoR, и у меня проблемы, надеюсь, вы, ребята, можете мне помочь.Рендеринг с файлами ссылок на скачивание с использованием рельсов и Dropbox

В контроллере:

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

По мнению:

[email protected] do |folder| 

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

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

    h3 three 
    [email protected][0][:description] 

    h3 four 
    [email protected][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 мс. Как я могу это исправить?

ответ

0

Прежде всего, вы можете включить их, как это объединение, используя следующий синтаксис:

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, если вы можете использовать их в частичном. Это сэкономит вам много времени и накладных расходов.

+0

Привет, спасибо за ответ. Я пытаюсь кэшировать фрагменты, но то же самое, представление занимает много времени в рендеринге. –

+0

Если вы просматриваете огромное количество файлов, это займет время. Итак, вы должны придумать некоторые альтернативы и посмотреть, как можно свести к минимуму тяжелые подъемы в просмотрах, например, если вы можете разделить виды в нескольких частичных. –