Как правильно делать подсчеты в Rails? - PullRequest
6 голосов
/ 14 декабря 2010

У меня есть приложение rails со множеством следующих фрагментов кода:

Our active community of <%= Account.find_all_by_admin(false).count %>

Мой вопрос - это правильный способ подсчета просмотров?Кажется, так "грязно", есть ли более изощренный способ подсчета?Я думаю, что, возможно, с именованными областями, но я просто хочу быть уверен, что подобные вещи не повлияют на производительность.

Спасибо,

Ответы [ 5 ]

9 голосов
/ 14 декабря 2010

Для подсчета вам не нужна область имен.

Account.where(:admin => false).count

Но именованные области видимости - отличный способ сделать ваш код более пригодным для повторного использования.

Именованные области не оказывают заметного влияния на производительность вашего приложения.

6 голосов
/ 14 декабря 2010

Я бы порекомендовал вам избегать прямого доступа к базе данных в моих шаблонах, потому что тогда вы теряете некоторую гибкость, когда дело доходит до кэширования.

Старайтесь подготовить все данные, которые вам нужно отобразить в вашемвместо действия, а затем используйте значимые переменные экземпляра, такие как @number_of_accounts или @accounts.count.

. Это сделает ваши представления более чистыми и проще в отладке, а также немного более СУХИМ, если вы будете визуализировать действие в различных форматах (html, jsonи т. д.)

Относительно того, как вы получаете свои цифры - это не так уж важно, просто отойдите от методов find_ * в сторону определения объема и написания читаемого кода

2 голосов
/ 14 декабря 2010

В рельсах 3 простой вызов для подсчета выдает простой запрос на подсчет:

Contact.count

разрешается как:

SELECT COUNT(*) AS count_id FROM "contacts"

поиск всех по имени поля будет разрешен как:

Contact.find_all_by_country("Canada")

SELECT "contacts".* FROM "contacts" WHERE ("contacts"."country" = 'Canada')

Я бы порекомендовал проиндексировать ваш столбец администратора для более быстрого поиска, и это можно перевести в именованную область, но это само по себе только предопределит запрос, но не оптимизирует его.

Важно отметить, что если вы выдадите

Contact.find_all_by_country("Canada").count

count - это метод класса массива, который фактически не выдает счет в базе данных:

Contact.find_all_by_country("Canada").count

SELECT "contacts".* FROM "contacts" WHERE ("contacts"."country" = 'Canada')
2 голосов
/ 14 декабря 2010

Именованная область не должна влиять на производительность

scope :not_admin, where(:admin => false)

Тогда вы можете иметь Account.not_admin.count

Отредактировано согласно комментарию DGM: Чтобы проверить сгенерированный SQL в консолисравнить Account.not_admin.to_sql с Account.find_all_by_admin(false).to_sql

0 голосов
/ 04 января 2016

Вы можете использовать следующий запрос вместо Account.where(:admin => false).count

Account.select(:id).where(:admin => false).count

Просто выберите один столбец вместо выбора всех.Он генерирует следующий запрос и работает быстрее, чем предыдущий:

SELECT COUNT("accounts"."id") FROM "accounts" where admin = false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...