我有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;
有人可以帮我翻译成红宝石吗?
答案 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中测试。