1

У меня есть следующий запрос в рамках моей модели:Как получить общий размер набора результатов в запросе count group_by?

Post.where("created_utc > ? AND lower(category) = ?", 0, 'videos').group(:domain).order('count_all desc').page(1).per(25).count 

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

Если вы предпочитаете не принимать во внимание kaminari, вы можете ссылаться на следующий запрос:

Post.where("created_utc > ? AND lower(category) = ?", min_time, subreddit.downcase).group(:domain).order('count_all desc').limit(limit).offset(start).count 

Несмотря на это, у меня нет никакой возможности выяснить, что общее число результатов. Как я могу это решить? Есть ли способ выяснить, какой общий размер набора результатов будет без ограничения?

+0

Вы пробовали 'размер' вместо подсчета? – BroiSatse

+0

@BroiSatse нет, но даже если я это сделаю, как это решить эту проблему? –

ответ

-1

Я бы разделить его на несколько строк:

# 1. get the results 
posts = Post.where("created_utc > ? AND lower(category) = ?", 0, 'videos').group(:domain).order('count_all desc') 
# 2. count the total size 
total_size = posts.count 
# 3. use kaminari for pagination 
posts_paged = posts.page(1).per(25) 
+0

Но разве это не приводит к запуску нескольких запросов? Я надеялся выполнить это в одном запросе. –

+0

Что вам нужно, это две разные вещи: общий счет и массив вычисленных результатов, правильно? Я думаю, вам нужно как минимум два запроса, чтобы достичь этого. – Yang

+0

Существует способ избежать двух запросов, но это может быть намного дороже. Лучшей идеей здесь может быть кэширование запроса (с чем-то вроде memcache), чтобы он не стоил дорого каждый раз. –

0

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

posts  = Post.where("created_utc > ? AND lower(category) = ?", min_time, subreddit.downcase) 
domain_count = posts.count("distinct domain") 
result  = posts.group(:domain).order('count_all desc').limit(limit).offset(start).count 
0

Что вы хотите .length вместо .count, как это:

Post.where("created_utc > ? AND lower(category) = ?", 0, 'videos').group(:domain).order('count_all desc').page(1).per(25).length 
  • .count выполняет SQL COUNT
  • .length вычисляет длину результирующего массива

любезно предоставлено @BenHawker по адресу https://stackoverflow.com/a/34541020/380607

Смежные вопросы