Questo funziona correttamente nel mio controller.Richieste di accodamento (lavoro ritardato) durante il download di file di dimensioni CSV di grandi dimensioni come processo in background
def export_list_sites_as_csv
require "csv"
csv_string = CSV.generate do |csv|
csv << ["id","name", 'etc']
@search.relation.not_archived.each do |site|
csv << [site.id, site.name, site.etc]
end
end
send_data csv_string,
:type => 'text/csv',
:filename => '_sites.csv',
:disposition => 'attachment'
end
@search
variabile dipende filtro utente, a misura che metterà sacco di carico sulla RAM, UX non è buona. Poiché le altre richieste verranno messe in attesa fino a quando la richiesta corrente non viene notificata. Il che sta anche bloccando il mio sistema. Quindi, cerca di eseguire il processo in background e di far sapere all'utente quando è pronto per il download.
Quando provo a passare al modello.
ottengo un metodo non definito errore di `Send_Data' per # < \ Class: 0x9f8bed0>
mi sto muovendo per modello, perché devo chiamare lavoro in ritardo su di esso.
Gestione di CSV e lavoro differito per la prima volta.
Modifica: ActionController::Streaming
è disponibile solo in Controller in modo diverso? più spesso o no, questo non sta andando da nessuna parte.
come D-Side risposta dice, dovrò cercare altri modi.
Edit2: seguito http://railscasts.com/episodes/171-delayed-job sono stato in grado di fare
class ExportCsv < Struct(:site_ids, :user_id)
def perform
require "csv"
sites = Site.where(id: site_ids)
CSV.open("tmp/#{user_id}.csv", "w+") do |csv|
csv << ["id","name", 'etc']
sites.each do |site|
csv << ....
end
end
end
def after(job)
send_file(
....
)
end
end
Come utilizzare ActionController::Streaming
all'interno di una classe personalizzata ExportCsv
, o Model
Edit:
comprensione circa la sincronizzazione e la come ho affrontato la situazione,
Risposta: http://imnithin.github.io/csv_download_with_delayed_job.html
'send_data' è il metodo disponibile solo in' ActionController :: Streaming'. –
quindi c'è un modo per aggirare? o per chiamare il lavoro in ritardo su questo metodo. – Nithin
penso, puoi fare come, chiamare la parte generata da csv nel modello come hai fatto, e chiamare quel metodo nel controller dopo aver messo la variabile risultato con send_data nello stesso controller. – amtest