수천 개의 레코드를 대량 업데이트해야하며 일괄 적으로 업데이트를 처리하고 싶습니다. 첫째, 시도 : 나는 SQL을 생성하는 것입니다 기대했다Rails 3/4에서 업데이트를 어떻게 일괄 적으로 실행할 수 있습니까?
Foo.where(bar: 'bar').find_in_batches.update_all(bar: 'baz')
... 같은 : update_all는 액티브 관계를 필요로하면서 find_in_batches는, 배열을 반환하기 때문에 작동하지 않습니다
"UPDATE foo SET bar = 'baz' where bar='bar' AND id > (whatever id is passed in by find_in_batches)"
.
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 절이 몇 행을 산출합니까? –
where 절은 수십만 개의 레코드를 검색하므로 find_in_batches를 사용하여 한 번에 1000 개씩 일괄 적으로 업데이트를 처리합니다. – MothOnMars
마리안과 같은 질문이지만, 나는 당신의 이성을 얻지 못합니다. Foo.where(). update_all을 수행하면 Rails에 레코드가로드되지 않고 db update 쿼리 만 수행됩니다. –