Как я могу сделать что-то вроде find_in_batches_by_sql в Rails - PullRequest
8 голосов
/ 11 октября 2011

find_in_batches не позволяет использовать чистый SQL (насколько я вижу).
find_by_sql не имеет пакетной поддержки (насколько я вижу).

Так, как я могу сделать что-то вроде find_in_batches_by_sql?

SQL - это неприятный программно сгенерированный материал, он указывает на сторонние базы данных, а наборы результатов могут возвращать от сотен тысяч до миллионов записей.

Есть ли другие уловки курсора с ActiveRecord, на которые мне стоит обратить внимание?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 11 октября 2011

Обновлено для использования правильного порядка для LIMIT и OFFSET

Вы всегда можете разбить SQL на части и сделать что-то вроде

Model.select("*").where("WHERE CLAUSE HERE").joins("JOIN CLAUSES HERE").find_in_batches {...}

Или, если вам нужнодействительно забавные вещи SQL, вы можете просто использовать смещение, лимит и цикл, пока не исчерпаете результаты.Вот основная идея:

offset = 0
limit = 1000

while(results)
  results = Model.find_by_sql("<your SQL here> LIMIT #{limit} OFFSET #{offset}")
  offset += limit  
  # Do stuff here
end
1 голос
/ 01 декабря 2017

Примечание смещение следует после лимита

offset = 0
limit = 1000

while(results)
  results = Model.find_by_sql("<your SQL here>  LIMIT #{limit} OFFSET #{offset}")
  offset += limit  
  # Do stuff here
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...