2012-01-20 19 views
1

私は3つのテーブル:グループ、ユーザー、および投稿を持っています。投稿にはuser_idがあり、ユーザーにはgroup_idがあります。私はどのグループに日付範囲の間にトップポスターがあるのか​​を知りたいのですが、ActiveRecordを使うのが望ましいです。私は、このクエリは仕事をしないと思う:これをrails arelクエリに変換する方法はありますか?または、このクエリを実行するためのより良い方法は?

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; 

は、誰かが私はルビーためにそれを翻訳手伝ってくれるか?

答えて

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 

それはキーがグループのIDであり、値はポストの数である{1=>4, 2=>5, 3=>2}のようなハッシュを返します。

次に、このハッシュをソートして配列の最後の要素を取得する必要があります。その後

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

top_posters_group[0]は、グループのIDになります、とtop_posters_group[1]はポストの数です。

しかし、とにかくこれは理想的な解決策ではありません。

レール3.1で、ルビー1.9.2でテスト済みです。

関連する問題