Мне нужно массовое обновление многих тысяч записей, и я хотел бы обрабатывать обновления в пакетах. Во-первых, я попробовал:
Foo.where(bar: 'bar').find_in_batches.update_all(bar: 'baz')
... который я надеялся создать SQL, например:
"UPDATE foo SET bar = 'baz' where bar='bar' AND id > (whatever id is passed in by find_in_batches)"
Это не работает, потому что find_in_batches возвращает массив, а update_all - отношение ActiveRecord.
Вот что я пробовал дальше:
Foo.where(bar: 'bar').select('id').find_in_batches do |foos|
ids = foos.map(&:id)
Foo.where(id: ids).update_all(bar: 'baz')
end
Это работает, но, очевидно, выполняется выбор, за которым следует обновление, а не одно обновление, основанное на моих условиях "where". Есть ли способ очистить это, так что выбор и обновление не должны быть отдельными запросами?