Свойства агрегации ActiveRecord в запросах - PullRequest
2 голосов
/ 14 апреля 2011

Я пытаюсь выполнить запрос, подобный следующему, используя ActiveRecord и Rails 3:

select count(*), * from messages group by thread_id

Я пытаюсь создать почтовый ящик простой системы многопоточных сообщений.Смысл этого запроса состоит в том, чтобы свернуть все объекты Message только до самого последнего для каждого потока и также получить размер потока.

В качестве альтернативы, я мог бы просто получить все верхние сообщения в потоке (простоудаление счетчика (*)), а затем выполнить подсчет как отдельный запрос для группы сообщений, но это кажется ужасно неэффективным.

У кого-нибудь есть идеи?Есть ли способ сделать это в ActiveRecord?

1 Ответ

1 голос
/ 14 апреля 2011

Чтобы получить rails (3) для генерации нужного запроса, попробуйте:

Message.select('count(*) as thread_size, *').group(:thread_id)

Количество сообщений в цепочке будет доступно как атрибут thread_size возвращаемых записей сообщений.

Если вы обнаружите, что этот запрос начинает замедляться по мере увеличения вашей базы данных, вы можете захотеть изучить функциональность counter_cache Rails (см. Раздел 4.1.2.4 Руководства по Rails ActiveRecord ).

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