2016-08-19 8 views
0

テーブル内のすべてのレコードに対して計算を実行しようとしています。しかし、何らかの理由で、find_eachを使用してテーブル内のすべての項目を繰り返し処理するか、レコードの一部が返されません。Rails find_eachとすべてのレコードが返されない

私は数100のレコードがある場所では発生しません。しかし、私がHerokuで実行しようとするたびに、それはいくつかのレコードをスキップするようです。

処理されていない個々のレコードに対してコードを実行しようとしましたが、期待どおりに処理されています。しかし、私がfind_eachループに入れると、すぐに動作しません。

私もIneventoryRecord.all.eachを使ってみましたが、同じ問題があるようです。

私は結果に表示されていないレコードを印刷しようとしましたが、何らかの理由でレコードがスキップされているように見えませんでした。

私は間違っていると思いますか?

コード

class InventoryReportTable::AverageForecast 

def generate 
    iterate_inventory_reports 
end 

private 
def iterate_inventory_reports 
    InventoryReport.find_each do |inventory_report| 

     average_lag_1_forecast = average_three_month_forecast(inventory_report.product_number, 1) 
     average_lag_2_forecast = average_three_month_forecast(inventory_report.product_number, 2) 

     inventory_report.average_lag_1_forecast = average_lag_1_forecast 
     inventory_report.average_lag_2_forecast = average_lag_2_forecast 
     inventory_report.save 
    end 
end 

def forecasts(product_number, lag) 
    extract_date_target_month_start = current_month_beginning - lag.month 
    Forecast 
     .where(extract_date: extract_date_target_month_start..extract_date_target_month_start.end_of_month) 
     .where(final: true) 
     .where(product_number: product_number) 
     .where(month: current_month_beginning..(current_month_beginning + 3.months) - 1.day) 
     .group(:month) 
     .sum(:quantity) 
end 

def average_three_month_forecast(product_number, lag) 
    hash_helper = Helpers::Hash.new 
    return hash_helper.average_hash(forecasts(product_number, lag))  
end 

# Helper methods 
def current_month_beginning 
    Date.today.beginning_of_month 
end 

def days_in_a_month 
    return 20 
end 

end 

編集

私は、どこに問題がある、私が把握できたかどうかを確認するために、いくつかのより多くのテストを行いました。

は、私はそこに無効な文字が問題の原因かどうかを確認するために、単純な

InventoryReport.find_each do |inventory_report| 
    puts inventory_report.product_number 
end 

ループを実行しましたが、それはケースのようには思えませんでした。

また、product_numberに後続スペースや先頭スペースがないことを確認したところ、見つからなかったことを確認しました。

+0

「見える」と書いたとき、あなたは100%確実ではないと思いますか?これが事実だと思いますか? 'InventoryReport'モデルはどのデータベースを使用していますか、どのような主キー/インデックスを持っていますか? –

+0

Excelで計算し、データベースに格納されている計算と照合すると、数値がオフになります。データベースの値は、Excelで取得している値よりもずっと低くなります。データベース内のデータをチェックすると、そこに実際の番号が存在する必要がある場合でも、まだ値がゼロのレコードがいくつかあります。 – Pras

+0

使用している主キーのデータベースとタイプは何ですか?バッチは、主キーが注文可能な場合にのみ機能し、ブロック内の 'InventoryReport'を変更すると、次のバッチのクエリにグリッチが発生する可能性があります。 –

答えて

0

私は最終的に何がうまくいかないかを考え出しました。私はHerokuでこのコードを実行するためにレーキを使用していました。 InventoryReportテーブルはかなり大きかったので、レーキはHeroku上でタイムアウトしていました。それはどんな誤りも投げなかったけれども。

私はバックグラウンドジョブにコードを移動してしまい、完全に機能しました。

関連する問題