【问题标题】:Rails find_each and each not returning all the recordsRails find_each 和 each 不返回所有记录
【发布时间】: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


【解决方案1】:

我终于弄清楚出了什么问题。我正在使用 rake 在 Heroku 上运行此代码。 InventoryReport 表相当大,因此 Heroku 上的 rake 超时。虽然它没有抛出任何错误。

我最终将代码移至后台作业,它运行良好。

【讨论】:

    猜你喜欢
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    相关资源
    最近更新 更多