Rails find_each并且每个都没有返回所有记录

时间:2016-08-19 17:57:01

标签: ruby-on-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中没有尾随或前导空格,但我找不到任何空格。

1 个答案:

答案 0 :(得分:0)

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

我最终将代码移动到后台工作,并且完美运行。