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