Есть ли способ преобразовать это в рельсы и запросы? Или лучший способ сделать этот запрос? - PullRequest
1 голос
/ 20 января 2012

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

select g_id, count(p_id) as posts_count 
from (
  select users.group_id as g_id, posts.id as p_id 
  from users inner join posts 
  on users.id = posts.user_id 
  where users.group_id is not null
  and posts.created_at > :since
  and posts.created_at <= :until
) as foo 
group by g_id 
order by posts_count desc limit 1;

Может кто-нибудь помочь мне перевести его на ruby?

1 Ответ

2 голосов
/ 23 января 2012

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

posts = Post.includes(
        :user
    ).where(
        'users.group_id is not null'
    ).where(
        :posts => {:created_at => ('12.09.2011'.to_date)..('12.09.2012'.to_date)}
    ).group(
        :group_id
    ).count

Он вернет хеш, например {1=>4, 2=>5, 3=>2}, где ключ - это идентификатор группы, а значение - количество сообщений.

Затем вам нужно отсортировать этот хеш и получить последний элемент массива.

sorted_hash = posts.sort_by {|key,value| value}
top_posters_group = sorted_hash[-1]

После этого top_posters_group[0] будет идентификатором группы, а top_posters_group[1] - количеством сообщений.

Но в любом случае это не идеальное решение.

Проверено в рельсах 3.1 с ruby ​​1.9.2.

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