find_each未迭代排查:有数据却不执行块代码?
问题原因及解决方案
以下是几种可能导致find_each块不执行的原因及对应解决办法:
输出缓冲导致内容未显示
在后台任务、生产环境等场景下,标准输出(stdout)通常是缓冲模式,puts的内容不会立即输出到控制台。可以改用无缓冲的标准错误输出,或者手动刷新缓冲:Barrier.where(active:true).where.not(branch_id:nil).find_each do |barrier| $stderr.puts "........................Barrier.........................." # 或者用 puts + 刷新 # puts "........................Barrier.........................." # $stdout.flush end模型回调中断迭代流程
检查Barrier模型中的before_find、after_find等回调,如果回调中抛出异常(哪怕被静默捕获),会直接中断find_each的迭代。可以临时注释掉模型回调,测试块是否能正常执行,逐步定位有问题的回调逻辑。find_each方法被自定义重写
查看项目中是否有针对Barrier模型或ActiveRecord::Base的猴子补丁(monkey patch)修改了find_each的行为。比如某些自定义扩展可能错误处理了块传递,导致带块调用时未触发迭代。可以在Rails控制台执行Barrier.method(:find_each).source_location,查看方法定义路径,确认是否为Rails原生实现。语法优先级异常(罕见)
虽然你的代码写法符合规范,但极端情况下do...end块可能被错误绑定到前面的方法。可以尝试改用大括号{}块测试:Barrier.where(active:true).where.not(branch_id:nil).find_each { |barrier| puts "........................Barrier.........................." }
内容的提问来源于stack exchange,提问作者Nero
相关产品推荐
相关产品推荐

