在Rails中,我们经常要取出大量的数据进行一定的操作,例如这样的:
Project.all.each do |project|
...
end
如果Project这张表有上千条上万条甚至更多的数据,会发生什么情况?Rails会将所有的数据取出,加载在内存里面,然后再进行循环。这个时候你会发现Rails的进程内存占用急剧增大,程序卡住许久才开始执行循环里面的代码,甚至有可能机器配置不够引起程序崩溃!
于是便有了find_in_batches这个方法,顾名思义,它就是按批次来取数据,避免一次性加载过多的数据。
这里是Rails的官方文档:http://api.rubyonrails.org/classes/ActiveRecord/Batches.html
使用起来是这样的:
Person.find_in_batches(start: 2000, batch_size: 2000) do |group|
group.each { |person| person.party_all_night! }
end
有两个参数
::batch_size - Specifies the size of the batch. Default to 1000. 每批次取出的数据数量
:start - Specifies the starting point for the batch processing. 开始的位置
另外还有一个更简洁的方法,find_each,实质上也是使用find_in_batches方法的封装:
Person.find_each(start: 2000, batch_size: 2000) do |person| person.party_all_night!
end