find_each_with_order

上一篇blog,分析了一下find_each的源码,后来又查了一下解决的办法,这里记录一下找到的几种可以代替find_each的方法。

第一种 先排好序,获取到已经排好序的ids数组,然后对数组分组执行

1
2
3
4
5
6
7
batch_size = 512
ids = Thing.order('created_at DESC').pluck(:id) # Replace .order(:created_at) with your own scope
ids.each_slice(batch_size) do |chunk|
Thing.find(chunk, :order => "field(id, #{chunk.join(',')})").each do |thing|
# Do things with thing
end
end

第二种 通过指定好数组区间,然后分组获取,原理和方法一相同,代码如下

1
2
3
4
5
total_records = 50000
batch = 1000
(0..(total_records - batch)).step(batch) do |i|
puts Thing.active.order("created_at DESC").offset(i).limit(batch).to_sql
end

rails find_each方法源码分析

在项目中我们经常会使用如下代码

1
2
3
Product.all.each do |product|
do_something
end

在实际应该中如果Product表太大,一次读取会把内存占满,Rails为了解决这个问题提供了两个方法,find_each和find_in_batches方法,把记录分成几个批次,因为find_each其实最终就是调用的find_in_batches,所以这里我们以find_in_batches为例。

1
2
3
Product.all.find_in_batches(start: 2000, batch_size: 5000,include: :infos) do |products|
do_something
end

ie8下Array不支持indexOf解决办法

今天碰到了一个ie8兼容性的bug,Array使用indexOf()报错,先介绍下indexOf的用法:

1
var indexVar = Array.indexOf(array, item, start);

搜索 Array 对象的指定元素并返回该元素的索引。
array: 要搜索的数组。
item: 要在数组中查找的对象。
startIndex:(可选)指定在数组中搜索的起始元素的索引号。

git删除远程仓库的某次提交以及误操作恢复

前两天工作的时候遇到了一个问题,开发的时候发现远程仓库之前的某次提交是没有必要的,需要删除掉这次提交。网上搜索了搜也没有找到解决的方法,问了问同事也都说不行。在我直觉看来git这么强大应该肯定可以得吧,后来突然想起了一个命令cherry-pick。

Git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作。例如,假设我们有个稳定版本的分支,叫v2.0,另外还有个开发版本的分支v3.0,我们不能直接把两个分支合并,这样会导致稳定版本混乱,但是又想增加一个v3.0中的功能到v2.0中,这里就可以使用cherry-pick了。
就是对已经存在的v3.0的某次commit合并到v2.0