【发布时间】:2016-08-22 10:28:36
【问题描述】:
我正在尝试对表中的所有记录进行计算。但是由于某种原因,当我使用 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 中没有尾随或前导空格,但我找不到任何空格。
【问题讨论】:
-
当你写“似乎”时,我假设你不是 100% 确定的?是什么让你认为情况如此?还有你使用的是什么数据库,
InventoryReport模型有什么样的主键/索引? -
当我在 Excel 中进行计算并对照存储在数据库中的计算进行检查时,数字是关闭的,数据库中的值远低于我在 Excel 中得到的值。然后检查数据库中的数据,当那里应该有一个实际数字时,有些记录仍然具有 nil 值。
-
您使用什么数据库和主键类型?批次仅在主键可排序时起作用,一种可能的解释是修改块内的
InventoryReports 会导致下一批的查询出现故障.. -
与您的问题完全无关的提示:您可能希望将范围添加到
Forecast类,以便您可以像这样编写查询:Forecast.final.with_lag(lag).up_to_months(3).where(product_number: product_number).sum(:quantity)。 -
感谢@ma_il 的所有帮助。这也是我最初因为 id 列而跳过项目的地方。但事实证明这是heroku上的超时问题。
标签: ruby-on-rails