2012-01-20 4 views
1

J'ai 3 tables: groupes, utilisateurs et messages. Les messages ont un user_id et les utilisateurs ont un group_id. Je voudrais savoir quel groupe a l'affiche supérieure entre une plage de dates, de préférence en utilisant seulement ActiveRecord. Je pense que cette requête fait le travail:Existe-t-il un moyen de convertir ceci en rails arel requêtes? Ou une meilleure façon de faire cette requête?

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; 

quelqu'un peut me aider traduis à rubis?

Répondre

2

Cela peut être fait en quelques étapes. Premier - obtenir le nombre de messages, regroupés par 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 

Il retournera un hachage comme {1=>4, 2=>5, 3=>2}, où la clé est un identifiant de groupe, et la valeur est le nombre de postes.

Ensuite, vous devez trier ce hachage, et obtenir le dernier élément de tableau.

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

Après cela, top_posters_group[0] aura un identifiant de groupe, et top_posters_group[1] est le nombre de postes.

Mais de toute façon ce n'est pas la solution idéale.

Testé sur rails 3.1 avec rubis 1.9.2.

Questions connexes