Лучший способ получить N запросов после лимита с ActiveRecord - PullRequest
0 голосов
/ 02 апреля 2020

Итак, вот моя проблема.

У меня есть база данных, которая импортирует огромные данные из CSV. Он содержит около 32000 записей, но содержит около 200 столбцов заголовков, поэтому стандартный выбор выполняется медленно.

Когда я делаю:

MyModel.all или MyModel.eager_load.all загрузка всех записей занимает от 45 секунд до минуты.

Идея заключалась в том, чтобы использовать предел для извлечения может быть 1000 записей, например:

my_model = MyModel.limit(1000)

Таким образом, я могу получить последний идентификатор, например:

last_id = my_model.last.id

Для загрузки следующих 1000 запросов я буквально использую

my_model.where('id > ?', last_entry).limit(1000)

# then I set last_entry again, and keep repeating the process

last_entry = my_model.last.id

Но это кажется излишним и не кажется правильным.

Есть ли лучший или более легкий способ сделать это?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Ruby на Rails имеет метод find_each, который делает именно то, что вы пытаетесь сделать вручную. Он загружает все записи из базы данных партиями по 1000 штук.

MyModel.find_each do |instance|
  # do something with this instance, for example, write into the CVS file
end
0 голосов
/ 02 апреля 2020

В Rails есть метод offset, который можно комбинировать с limit.

my_model = MyModel.limit(1000).offset(1000)

Документацию по API можно посмотреть здесь: https://apidock.com/rails/v6.0.0/ActiveRecord/QueryMethods/offset

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...