ActiveRecord: размер vs количество

в Rails вы можете найти количество записей, используя оба Model.size и Model.count. Если вы имеете дело с более сложными запросами, есть ли преимущество в использовании одного метода над другим? Чем они отличаются?

например, у меня есть пользователи с фото. Если я хочу показать таблицу пользователей и сколько у них фотографий, будет запущено много экземпляров user.photos.size быть быстрее или медленнее, чем user.photos.count?

спасибо!

4 ответов


следует читать это, он все еще действителен.

вы адаптируете функцию, которую используете, в зависимости от ваших потребностей.

по сути:

  • если вы уже загружаете все записи, скажите User.all, то вы должны использовать length чтобы избежать другого запроса БД

  • если у вас ничего не загружено, используйте count чтобы сделать запрос count на вашем db

  • если вы не хотите беспокоиться об этом соображения, используйте size который будет адаптироваться


как говорится в других ответах:

  • count будет выполнять SQL COUNT запрос
  • length вычислит длину результирующего массива
  • size будет пытаться выбрать наиболее подходящий из двух, чтобы избежать чрезмерных запросов
size действует по-разному count/lengthв целом, и я думал, что я разделю его, так как это достаточно редко, чтобы быть упущенный.
  • если вы используете :counter_cache на


иногда size "выбирает неправильный" и возвращает хэш (что и есть count будет делать)

В этом случае используйте length для получения целое вместо хэш.


следующие стратегии все делают вызов в базу данных для выполнения COUNT(*) запрос.

Model.count

Model.all.size

records = Model.all
records.count

следующее Не так эффективно, как будет загружать все записи из базы данных в Ruby, который затем подсчитывает размер коллекции.

records = Model.all
records.size

если ваши модели имеют ассоциации, и вы хотите найти количество принадлежащих объектов (например,@customer.orders.size), вы можете избежать запросов к базе данных (чтения дисков). Используйте счетчик кэша и рельсы будут держать значение кэша обновлено и возвращает это значение в ответ на size метод.