有没有办法将其转换为rails arel查询?或者更好的方法来执行此查询?

时间:2012-01-20 03:01:30

标签: sql ruby-on-rails activerecord

我有3个表:组,用户和帖子。帖子有一个user_id,用户有一个group_id。我想找出哪个组在日期范围之间有顶级海报,最好只使用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;

有人可以帮我翻译成红宝石吗?

1 个答案:

答案 0 :(得分:2)

可以通过几个步骤完成。 首先 - 获取按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}的哈希值,其中key是组的id,值是帖子的数量。

然后你需要对这个哈希进行排序,并获得数组的最后一个元素。

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

之后,top_posters_group[0]将成为群组的ID,top_posters_group[1]是帖子的数量。

但无论如何这不是理想的解决方案。

使用ruby 1.9.2在rails 3.1中测试。