каждый или find_each? Или нужен smart_each? - PullRequest
0 голосов
/ 05 мая 2018

У меня есть такой код:

User.any_scope.each do |user|
  user.do_anything
end 

если у меня большое количество пользователей:

User.any_scope.find_each do |user|
  user.do_anything
end

, если число пользователей <100: </p>

не рекомендуется использовать find_each

А как насчет такого кода:

def smart_each_for(user)
  MAX_COUNT = 100
  user.count > MAX_COUNT ? 'find_each' : 'each'  # 100 - 
end

smart_each = smart_each_for(User.any_scope)

User.any_scope.send :smart_each do |user|
  user.do_anything
end

Это хорошая идея для исполнения? Как насчет MAX_COUNT? Какое значение должна иметь эта переменная?

1 Ответ

0 голосов
/ 05 мая 2018

См. Документы find_each метод:

ПРИМЕЧАНИЕ. Невозможно установить порядок. Это автоматически устанавливается на возрастание по первичному ключу («id ASC»), чтобы выполнить пакетное упорядочение Работа. Это также означает, что этот метод работает только тогда, когда первичный ключ можно заказать (например, целое число или строку).

ПРИМЕЧАНИЕ: вы также не можете установить предел, который используется для управления партией размеры.

ПРИМЕЧАНИЕ. По своей природе пакетная обработка зависит от условий гонки, если другие процессы модифицируют базу данных.

Примечание. Этот метод предназначен только для пакетной обработки большое количество записей, которые не помещаются в память сразу. Если вам просто нужно перебрать менее 1000 записей, это, вероятно, лучше просто использовать обычные методы поиска.

Так что нет, не стоит использовать его в предоставленных вами примерах.

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