ActiveRecord: считать с группами - PullRequest
6 голосов
/ 29 февраля 2012

У меня есть модель поста с has_many комментариями.У каждого сообщения есть идентификатор потока (но нет модели с именем Thread).

Так что, если я хочу посчитать количество потоков в этом сообщении, я делаю что-то вроде

> post.comments.count(:thread, :distinct => true)
SELECT COUNT(DISTINCT "comments"."thread") FROM "comments" WHERE "comments"."post_id" = 3

И этоработает отлично.Но что, если я хочу посчитать количество потоков только с одним комментарием?

> post.comments.group(:thread).having('COUNT(*) == 1').count
SELECT COUNT(*) AS count_all, thread AS thread FROM "comments" WHERE "comments"."post_id" = 3 GROUP BY thread HAVING COUNT(*) == 1 ORDER BY id

Так что вместо Integer у меня есть OrderedHash.И я должен сделать ненужный шаг

> post.comments.group(:thread).having('COUNT(*) == 1').count.count

Есть ли лучшее решение?

1 Ответ

15 голосов
/ 21 сентября 2012

Это ожидаемое поведение.

post.comments.group(:thread).having('COUNT(*) == 1').count

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

Я не уверен, как это будет выглядеть в Rails, но вот SQL, который, я думаю, вам нужен:

SELECT COUNT(*) FROM 
  SELECT COUNT(*) AS count_all, thread AS thread 
  FROM "comments"
  WHERE "comments"."post_id" = 3 
  GROUP BY thread
  HAVING COUNT(*) == 1
  ORDER BY id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...