В Rails вы можете найти количество записей, используя Model.size
и Model.count
. Если вы имеете дело с более сложными запросами, есть ли преимущество в использовании одного метода перед другим? Насколько они разные?
Например, у меня есть пользователи с фотографиями. Если я хочу показать таблицу пользователей и сколько у них фотографий, будет ли запускать много экземпляров user.photos.size
быстрее или медленнее, чем user.photos.count
?
Спасибо!
size
все равно адаптируется к ситуации, то зачемlength
иcount
вообще нужно ?size
можно было звонить им, когда вы звонитеsize
(после того, как он определит, кому звонить).Comment.create(post_id: post.id)
Вашаpost.comments.size
не будет актуальной, покаpost.comments.count
будет. Так что просто будь осторожен.company.devices.build(:name => "device1"); company.devices.build(:name => "device2")
тогдаcompany.devices.size
и.length
будет включать количество объектов, которые вы создали, но не сохранили,.count
будет сообщать только счетчик из базы данных.Поскольку другие ответы заявляют:
count
выполнитCOUNT
запрос SQLlength
рассчитает длину полученного массиваsize
постараюсь выбрать наиболее подходящий из двух, чтобы избежать чрезмерных запросовНо есть еще одна вещь. Мы заметили случай, когда
size
действует иначеcount
или вlength
целом, и я подумал, что поделюсь им, потому что это достаточно редко, чтобы его упустить из виду.Если вы используете
:counter_cache
наhas_many
ассоциацию,size
будет использовать кэшированную рассчитывать непосредственно, а не сделать дополнительный запрос вообще.Это поведение описано в Руководствах по Rails , но я либо пропустил его в первый раз, либо забыл об этом.
источник
_count
столбец (безcounter_cache: true
директивы об ассоциации). Это было исправлено в github.com/rails/rails/commit/e0cb21f5f7Иногда
size
«выбирает неправильный» и возвращает хэш (что иcount
будет)В этом случае используйте,
length
чтобы получить целое число вместо хеша .источник
ТЛ; др
count
.length
.size
...подсчитывать
Разрешает отправку
Select count(*)...
запроса в БД. Путь, если вам не нужны данные, а только счет.Пример: количество новых сообщений, общее количество элементов, когда будет отображаться только страница, и т. Д.
длина
Загружает необходимые данные, то есть запрос по мере необходимости, а затем просто считает их. Путь, если вы используете данные.
Пример: сводка полностью загруженной таблицы, заголовки отображаемых данных и т. Д.
размер
Он проверяет, были ли данные загружены (то есть уже в рельсах), если это так, а затем просто подсчитывает их, в противном случае он вызывает count. (плюс подводные камни, уже упомянутые в других записях).
В чем проблема?
Возможно, вы дважды нажмете на БД, если не сделаете это в правильном порядке (например, если вы отобразите количество элементов в таблице поверх визуализированной таблицы, в БД будет фактически отправлено 2 вызова).
источник
Следующие стратегии все делают вызов в базу данных для выполнения
COUNT(*)
запроса.Следующее не так эффективно, так как оно загружает все записи из базы данных в Ruby, который затем подсчитывает размер коллекции.
Если у ваших моделей есть ассоциации, и вы хотите найти количество принадлежащих объектов (например
@customer.orders.size
), вы можете избежать запросов к базе данных (чтение с диска). Используйте счетчик кеша, и Rails будет обновлять значение кеша и возвращать это значение в ответ наsize
метод.источник
Model.all.size
и другоеModel.all.count
генерируютcount
запрос в Rails 4 и выше. Реальное преимуществоsize
заключается в том, что он не генерирует запрос подсчета, если связь уже загружена. В Rails 3 и ниже я считаю, чтоModel.all
это не отношение, поэтому все записи уже загружены. Этот ответ может быть устаревшим, и я предлагаю удалить его.Я рекомендовал использовать функцию размера.
Рассмотрим эти две модели. У клиента есть много действий клиента.
Если вы используете: counter_cache для ассоциации has_many, size будет напрямую использовать кэшированный счетчик и вообще не будет делать дополнительный запрос.
Рассмотрим один пример: в моей базе данных один клиент имеет 20 000 действий клиентов, и я пытаюсь подсчитать количество записей действий клиентов этого клиента с помощью каждого из методов подсчета, длины и размера. здесь ниже сравнительный отчет всех этих методов.
поэтому я обнаружил, что использование: counter_cache Size - лучший вариант для расчета количества записей.
источник