8

タブ区切りのドキュメントをアップロードし、コントローラーで処理しています。すべて正常に動作しますが、大きなファイルでは時間がかかる場合があります。これをアプリの他の場所で作業しているdelay_jobに移動したいのですが、これはコントローラー内にあるため、同じ方法で呼び出すことはできません。

フォームはprocess_fileアクションを呼び出し、次に、salesuploadアクションを呼び出します。これをバックグラウンドジョブにするにはどうすればよいですか?

class SalesController < ApplicationController

  def salesupload(file)
    uploaded_io = file.read
    numrows = "uploaded_io.size"
    FasterCSV.parse(uploaded_io, {:headers => true, :col_sep =>"\t"}).each do |row_data|
        full, upc, _discard, isrc = row_data[26].match(/^([^_]+)(_(.+))?/).to_a
          new_record = AppleSale.new(
              'provider' =>  row_data[0],
              'provider_country' => row_data[1],
              'vendor_identifier' => row_data[2]
          )
      new_record.save
    end
  end

    def process_file
        file = params[:apple_sale][:tsv_file]
        salesupload(file)
    end

end
4

3 に答える 3

10

これを行う必要があるときに、コントローラーで定義されたメソッドはクラスメソッドでなければならないことがわかりました。これがなぜだったのか思い出せません。もっと明確な受信機を持っていることに関係していると思います。したがって、salesuploadメソッドをクラスメソッドにしてから、それを呼び出すだけ.delayです。

def self.salesupload(files)
  # code
end

def process_file
  file = params[:apple_sale][:tsv_file]
  SalesController.delay.salesupload(file)
  head :no_content
end

そして、あなたは行ってもいいはずです!process_fileまた、AJAXを介して呼び出される元のメソッド(この場合)を作成head :no_contentし、リダイレクトなどを必要とせずに何かを返すようにを追加しました。

于 2012-10-18T14:22:34.570 に答える
2

これを行うためにdelayed_actionというgemを作成しました。

この場合、あなたは書くでしょう delayed_action [:sales_upload]

以上です。

于 2016-01-09T00:06:56.323 に答える
1

このコードをモデルまたは別のクラス(たとえば、libフォルダー内)に移動する必要があると思います。しかし、それは組織とベストプラクティスの問題にすぎません。

このコードをバックグラウンドで実行することについては、多くのオプションがあります。delayd_jobを使用したい場合は、次のスクリーンキャストを見る必要があると思います:http: //railscasts.com/episodes/171-delayed-job

ただし、基本的には、遅延ジョブを設定した後、send_later(:process_file)のようなものを使用して、そのプロジェクトをバックグラウンドで実行するように指示します。これは非常に簡単です。コマンドとデータ構造はデータベーステーブルに保存され、後で別のプロセスで実行できます。Railscastを見た後、あなたはあなたの答えを得るだろうと想像します;)

于 2012-10-18T14:28:01.187 に答える