为什么find_each不尊重过滤器

时间:2015-05-06 18:49:14

标签: ruby-on-rails ruby-on-rails-4 activerecord

我有一个rake任务,每天我应该加载10_000个用户和进程,就像这样

uptime = Sys::Uptime.days
batch = 10_000

Person.limit(batch).offset(batch*uptime).find_each do |p|
  Namespace::UserWorker.perform_async(p.to_global_id)
end

结果是debuggin,我意识到find_eachs似乎忽略了我的限制和偏移,并加载了超过10000个用户。我该怎么办?使用each代替find_each

2 个答案:

答案 0 :(得分:2)

您需要的是批量分组,ActiveRecord有一个帮助:

http://apidock.com/rails/ActiveRecord/Batches/find_in_batches

batch_size = 1000
start = 0
Person.find_in_batches(batch_size:batch_size, start:start) do |p|
  Namespace::UserWorker.perform_async(p.to_global_id)
end

答案 1 :(得分:1)

find_each覆盖limitoffset条件,仅加载部分/批次数据。因此,在您的情况下,不要指定自己的limitoffset条件:

Person.find_each(batch_size: 10_000) do |p|
  Namespace::UserWorker.perform_async(p.to_global_id)
end