Подтвердить что ты не робот

Использование named_scope для получения количества строк

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

Я хотел бы получить подсчет ряда строк, т.е. a 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(*). У меня есть большое количество строк в базе данных, которую я запрашиваю.

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

4b9b3361

Ответ 1

Встраивается функциональность, которую вы ищете.

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

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

Ответ 2

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

Ответ 3

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

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

@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"