2016-08-19 89 views
0

我想對錶中的所有記錄運行計算。但是由於某種原因,當我使用find_each遍歷表中的所有項時,或者每個記錄都沒有返回時。Rails的find_each和每個不返回所有的記錄

這不會發生在我有幾百條記錄的地方。但是任何時候我試圖在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's會干擾下一批的查詢。 –

回答

0

我終於明白出了什麼問題。我正在使用Rake在Heroku上運行此代碼。 InventoryReport表格相當大,所以Rake在Heroku上超時。雖然它沒有拋出任何錯誤。

我最終將代碼移動到後臺作業,並完美運行。

相關問題