我需要批量更新数千条记录,我想分批处理更新。首先,我试过:
Foo.where(bar: 'bar').find_in_batches.update_all(bar: 'baz')@H_502_4@…我希望生成sql,如:
"UPDATE foo SET bar = 'baz' where bar='bar' AND id > (whatever id is passed in by find_in_batches)"@H_502_4@这不起作用,因为find_in_batches返回一个数组,而update_all需要一个ActiveRecord关系。 @H_502_4@这是我接下来尝试的:
Foo.where(bar: 'bar').select('id').find_in_batches do |foos| ids = foos.map(&:id) Foo.where(id: ids).update_all(bar: 'baz') end@H_502_4@这有效,但它显然运行一个选择后跟更新,而不是基于我的’where’条件的单个更新。有没有办法清理它,以便选择和更新不必是单独的查询?
解决方法
在Rails 5中,有一个新的方便的方法ActiveRecord :: Relation #in_batches来解决这个问题:
Foo.in_batches.update_all(bar: 'baz')@H_502_4@检查documentation了解详情。