Gema de trabajo retrasado para CSV

Es esencial tener un servidor rápido ya que la demora en el procesamiento puede literalmente acabar con el flujo de ingresos de una empresa y frustrar a los usuarios. La velocidad de un sitio web es el tiempo real que tarda una página web en cargarse en la pantalla después de ser solicitada por el navegador. Ahora considere un escenario en el que necesita utilizar una base de datos enorme y enviar correos electrónicos a una lista más larga que el Muro de China. Exageración o no, enviar correos electrónicos a una larga lista de personas llevará tiempo, aumentando el tiempo de procesamiento, lo que ralentizará el servidor y molestará a los usuarios.

El requisito de realizar tareas asincrónicas en aplicaciones web fuera del ciclo de manejo de solicitudes HTTP es una necesidad para cualquier organización que maneje datos pesados. Si tiene tareas que requieren muchos datos y deben manejarse en segundo plano, una de las mejores formas de combatirlas es mediante el uso Trabajo retrasado. Como sugiere el propio nombre, el 'Trabajo retrasado' es una gema Ruby que se puede aplicar para ejecutar ciertas tareas en un proceso en segundo plano en el entorno Rails. Programar tareas con un cronograma para ejecutarlas todas juntas; se prefiere la primera debido al uso conservador de los recursos.

Trabajo retrasado is especially more important when it comes to handling CSV files where you have records which are dynamic in nature and size of records are high. It takes a lot of RAM space and doesn’t accept other requests during the preparation of CSV file. To overcome this, Trabajo retrasado Se utiliza gema. Consulte los códigos para obtener más información sobre cómo podemos agregar esta joya:

La forma habitual

def download require “csv” csv_string = CSV.generate do |csv| csv << [“ID”,….] @search.each do |site| csv << [site.id, ……..] end end send_data csv_string, :type => ‘text/csv’, :filename => ‘_sites_list.csv’, :disposition => ‘attachment’ end

En el escenario anterior, hay una gran cantidad de columnas con más de 50.000 registros cuando se solicitan para todos los registros (sitios), lo que mantiene el sistema con una carga pesada.

El método de la gema del trabajo retrasado

descargar definitivamente

ExportCsv.new(@search.to_a.map(&:id), current_user.id).delay.perform

fin

El enlace/botón para descargar el método debe ser una llamada AJAX.

La clase personalizada para operaciones de trabajo retrasadas en la carpeta lib.

export_csv.rb class ExportCsv < Struct.new(:site_ids, :user_id) def perform require “csv” User.find(user_id).update_attributes(xls_download: false) # pre-run, making sure. sites = Site.where(id: site_ids) CSV.open(“tmp/sites_xls/#{user_id}.csv”, “w+”) do |csv| csv << [“ID”, …..] sites.each do |site| csv << [site.id, …..] end end end def after(job) User.find(user_id).update_attributes(xls_download: true) end handle_asynchronously :perform end

Como no podemos usar objetos de sesión, se creó un nuevo atributo xls_download para la tabla de usuarios. El atributo se establecerá en verdadero después del método proporcionado por el trabajo retrasado, una vez que se complete el proceso del método de ejecución.

Una vez que se completa la preparación del CSV, el archivo parece estar en la ruta de la aplicación, pero ¿cómo le informa que está listo y que ha completado el proceso de escritura en CSV?

download.js.erb alert(‘Preparing file to download, you will be notified once its complete…’); timeout(‘<%= SOME_DELAY %>’);

Entonces, ¿qué hay dentro de la función de tiempo de espera? ¿Cómo notifica el sistema que está listo para entregar el archivo?

function timeout(time) { setTimeout(function() { $.ajax({ url: “/controller/check_if_ready?”, type : ‘GET’, dataType : ‘json’, success: function(response) { if(response.value === “success”) { var value = confirm(“File ready to download ?”); if (value == true) { window.location=”/controller/download_csv.csv”; } else if(value == false) { $.ajax({ url: “/controller/remove_file”}) } } else { timeout(‘4000’) // wait 4 seconds } }, }); }, time); } The AJAX call. check_if_ready? def check_if_ready? if current_user.set_xls_download? && File.exist?(@file_path) render json: { value: “success” } else render json: { value: nil } end end

Navegación a diferentes fuentes.

It seems everything’s fine but what if the user navigates different pages.

Llame a la función en cualquier diseño necesario.

%script – if session[:download] timeout(‘#{DELAY}’);

Utilice un atributo de bandera para realizar llamadas de encuesta; una vez que se complete la descarga, puede volver a cero/falso.

Algunos puntos finales

  • El valor de retraso se puede configurar en función del recuento de registros para reducir la cantidad de llamadas Ajax. Pero en la navegación a diferentes páginas es posible que también desee tener un retraso menor, ya que el usuario puede realizar otra solicitud dentro de ese valor de retraso.
  • Elimine el archivo y restablezca los valores después de la descarga.
  • ¿Qué pasa si hay una solicitud de descarga de varios archivos? Puede procesarlo permitiendo al usuario realizar solo una solicitud de descarga a la vez.
  • On Capistrano deployment process, you may have to restart the delayed job process and make sure no download is in progress. If not handled – The Ajax call may get into loop and request may be endless, counter value can be used to fix this and kill the request.

¿Quieres saber más sobre cómo funcionan esta y otras joyas? Con soluciones ingeniosas, valores comerciales progresivos y un historial comprobado, RielesCarma es el más adecuado para ayudarle con todas sus necesidades de desarrollo. Nuestro proceso de desarrollo se basa en gran medida en una atención incesante a los detalles, incluida la calidad, el diseño y la excelencia. Convertimos tus ideas en realidad. Si tiene alguna consulta, puede Contáctenos.

Leer artículos similares: Póngase en contacto con nosotros.

Suscríbete para recibir las últimas actualizaciones

Artículos Relacionados

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Spanish
English
English
Japanese
German
French
Spanish

envíanos whatsapp

Salir de la versión móvil