Получение общего количества результатов в разбивке на страницы

0

В моем приложении RoR у меня есть запрос, который может возвращать от 0 до 1000000 результатов, что я ограничиваю 16 и предоставляет разбиение на страницы для:

find(:all, :conditions => conditions, :limit => limit, :offset => offset)

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

2 ответа

2
Лучший ответ

Казалось бы, я должен был использовать google немного более тщательно. Rails имеет встроенный класс ActiveRecord:: Calculations (go figure), чтобы сделать прагматичный подсчет базы данных. Я закончил использование кода следующим образом:

results = find(:all, :conditions => conditions, :limit => limit, :offset => offset)
total_count = count(:conditions => conditions)
return {:results => results, :total_count => total_count}
  • 1
    Да, Bloudermilk, вы можете использовать параметр count без :limit чтобы получить количество всех возвращаемых строк. Перегрузка базы данных не вызывает проблем: они обычно могут очень быстро обрабатывать запросы COUNT . Просто убедитесь, что у столбцов условий есть индексы, и все будет работать нормально. Я действительно не рекомендую такие решения, как хранимые процедуры или функции запуска. База данных программы напрямую может быть настолько болезненной и приводить к таким большим головным болям, что для этого у вас должна быть реальная причина.
0

В базе данных нет способа узнать количество строк, соответствующих запросу, если оно фактически не выполняет все это. Например, если вы выбираете для MYCOLUMN > 5, тогда ему нужно прочитать MYCOLUMN в каждой строке таблицы, чтобы узнать, сколько из них имеют значения больше 5. (Хотя вы могли бы повысить эффективность с помощью индекса.)

Обычно для целей, которые вы описали, используется COUNT (*).

Единственный другой способ, с помощью которого можно получить количество строк, которые будут возвращены для запроса без большой работы, - это добавить триггерную функцию в таблицу, которая обновляет счетчик каждый раз, когда строка вставлена, обновлена ​​или удаляется в зависимости от того, соответствует ли он запросу. Тем не менее, это жестко, поскольку оно должно быть настроено для индивидуальных запросов, и это, безусловно, не является агностическим подходом к базе данных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню