2017-05-26 12 views
2

私は、postgresテーブルに接続してロジックとコードを適用するモジュールをrubyで書いています。以下はレールでの接続処理の破損

はサンプルコードです:

module SampleModuleHelper 
    def self.traverse_database 
    ProductTable.where(:column => value).find_each do |product| 
     #some logic here that takes a long time 
    end 
    end 
end 

ProductTableは300万人以上のレコードを持っています。私はwhere句を使用して検索されたレコードの数を減らしました。

しかし、私はコード接続の証明をする必要があります。接続が途切れ、最初からテーブルを横断し始める必要がある時があります。私はこれを望んでいない、むしろそれは取った時間が各レコードのためにあまりにも多いので、中断したところから始めるべきである。

コードを途中で中止するにはどうすればよいでしょうか?

1つの方法は、停止した場所の主キー(id)を記録してそこから再び開始するテーブルをデータベースに作成することです。しかし、このようなプロセスが多いため、データベースにテーブルを作成する必要はありません。

答えて

2

処理されたレコードのカウンタを保持し、処理を続行するにはoffsetメソッドを使用できます。

の線に沿って何か:私は再び機能を起動した場合

MAX_RETRIES = 3 
def self.traverse(query) 
    counter = 0 
    retries = 0 
    begin 
    query.offset(counter).find_each do |record| 
     yield record 
     counter += 1 
    end 
    rescue ActiveRecord::ConnectionNotEstablished => e # or whatever error you're expecting 
    retries += 1 
    retry unless retries > MAX_RETRIES 
    raise 
    end 
end 

def self.traverse_products 
    traverse(ProductTable.where(column: value)) do |product| 
    # do something with `product` 
    end 
end 
+0

のが、どのように同じポイントからこの関数を再開していますか? traverse_productsが呼び出されるたびに、カウンタとリトライがゼロに初期化されます。 –

+0

エラーを再試行するため、再起動する必要はありません。あなたはどんな種類のエラーが発生することが予想されているのかわからなかったので、正しいエラークラスをプラグインする必要があります... –

+0

これは素晴らしいです...しかし、私は私の目的を果たすとは思わない。私はcronタスクで関数を実行する必要があり、前の日を停止した場所から実行する必要があります。 –

関連する問題