我想對錶中的所有記錄運行計算。但是由於某種原因,當我使用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中沒有尾隨或前導空格,但找不到任何。
當你寫「似乎」,我假設你不是100%確定?是什麼讓你認爲這是事實?你還使用了什麼數據庫,'InventoryReport'模型有哪些主鍵/索引? –
當我在Excel中進行計算並根據存儲在數據庫中的計算值進行檢查時,數字已關閉,數據庫中的值遠低於Excel中的值。然後檢查數據庫中的數據,當應該有實際的數字時,有些記錄仍然沒有值。 – Pras
你使用的是什麼數據庫和主鍵類型?批處理只在主鍵可訂購時才起作用,並且一種可能的解釋是修改塊內的InventoryReport's會干擾下一批的查詢。 –