我需要批量更新数千条记录,并且我想批量处理更新。首先,我尝试:
Foo.where(条:'bar')。批量查找。全部更新(条:'baz'))
…我希望它能生成SQL,例如:
更新foo SET bar='baz'其中bar='bar'和id>;(find\u in\u批传递的任何id)
这不起作用,因为find\u in\u批处理返回一个数组,而update\u都需要一个ActiveRecord关系
这就是我接下来尝试的:
Foo.where(bar:'bar')。选择('id')。在批处理中查找|
id=foos.map(&;:id)
Foo.where(id:ids).update_all(bar:'baz')
终止
这是可行的,但它显然会在更新之后运行一个select,而不是基于我的“where”条件的单个更新。有没有办法清理这个问题,使选择和更新不必是单独的查询
在Rails 5中,有一种新的简便方法ActiveRecord::Relation#In#In_batches来解决这个问题:
Foo.in\u batches.update\u all(条形图:“baz”)
查看文档了解详细信息