Использование named_scope для получения количества строк - PullRequest
12 голосов
/ 04 января 2009

Rails-гуру: я только что обнаружил named_scope благодаря другому пользователю SO. :)

Я бы хотел получить количество наборов строк, т. Е. SELECT COUNT(*). Кроме того, я хочу по-прежнему иметь возможность связывать именованные области в вызове.

Является ли это законным (хотя и странным) использованием именованной области действия?

named_scope :count, :select => "COUNT(*) as count_all"

Итак, я могу сделать (например):

@foobar = Foobar.count.scope.scope.scope

Доступ к счету осуществляется через @foobar.first.count_all.

(отредактировано с учетом комментариев Аллана)

Вы можете сделать:

@foobar = Foobar.scope.scope.scope.size

Но это вызовет запрос результата, а не более быстрый SELECT COUNT(*) запрос. У меня есть большое количество строк в базе данных, к которой я обращаюсь.

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

Ответы [ 3 ]

20 голосов
/ 04 января 2009

Встроенная функциональность.

Foobar.count # SELECT count(*) AS count_all FROM "foobars"
Foobar.named_scope.count # SELECT count(*) AS count_all FROM "foobars" WHERE ....

Если вы запустите script/server в режиме разработки, вы увидите запросы по мере их выполнения.

2 голосов
/ 04 января 2009

Есть лучший способ сделать это, рельсы уже дают вам средства.

Используя ваш пример, вы можете просто сделать это:

@foobar_size = Foobar.all.size #returns integer equal to total rows of Foobar

и даже охват это так:

@banned_foobars = Foobar.scope_to_find_banned.size #returns integer equal to total rows for "scope_to_find_banned"
2 голосов
/ 04 января 2009

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

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