2017-08-09 1 views
1

Un Message a les attributs location, like_count, vote_count.Comment faire la somme des enregistrements parent et enfant lorsqu'ils sont groupés?

Et Commentbelongs_to :message et possède les attributs like_count, vote_count

J'ai réussi à comprendre comment hachage le location ainsi que le nombre de voix, le Message a été donné en ce location particulier.

@votes_by_place = Message.where(
:user_id => @user.id).select(
:location).group(:location).sum('like_count + vote_count') 

# => "Total votes and likes of your Messages posted in New York, United States ": 192 
# => "Total votes and likes of your Messages posted in Paris, France ": 93 

je pouvais le garder comme ça et ce serait bien, mais j'aimerais vraiment vraiment si je pouvais trouver un moyen de résumer la vote_count et like_count de comments avec user_id => @user.id et dans un @message.location spécifique

Alors qu'il deviendrait:

# => "Total votes and likes of your Messages and Comments posted in New York, United States ": 192 
# => "Total votes and likes of your Messages and Comments posted in Paris, France ": 93 

peut-être que ce serait plus facile si je location à Comments affecté aussi bien? Faites-moi savoir ce que vous pensez et toutes les suggestions seraient très appréciées!

Répondre

1

Je ne sais pas comment faire cela en une seule requête, mais avec deux requêtes et un peu de Ruby, cela peut être fait. Peut-être que quelqu'un d'autre peut trouver un moyen plus efficace.

with_comments = Message.where(user_id: @user.id). 
    left_outer_joins(:comments). 
    group(:location). 
    sum('messages.like_count + messages.vote_count + comments.like_count + comments.vote_count') 

Cette première requête ajoute toutes les like_count s et vote_count s des deux tables messages et comments pour messages qui ont associé comments. L'utilisation de left_outer_joins garantit que l'appel à group ajoute des clés de hachage pour tous les emplacements de message, y compris ceux qui n'ont pas de commentaires associés, de sorte que tous les emplacements de messages de l'utilisateur sont représentés.

without_comments = Message.where(user_id: @user.id). 
    left_outer_joins(:comments). 
    where(comments: { message_id: nil }). 
    group(:location). 
    sum('messages.like_count + messages.vote_count') 

Cette deuxième requête ajoute tous les like_count s et vote_count s à partir de seulement la table messages pour messages qui ne sont pas associés comments.

totals = with_comments.dup 

totals.each_key do |location| 
    totals[location] += without_comments[location].to_i 
end 

dup le premier hachage et itérer sur elle, en additionnant les valeurs des deux hachages et la conversion des valeurs de nil0.

+0

J'ai finalement réussi à faire fonctionner ça. Peu importe s'il y a une meilleure façon de le faire, c'est la bonne réponse pour l'instant. Cela couvre tous les aspects s'il y a un message qui n'a pas de commentaire, et tous les commentaires, peu importe s'ils appartiennent à un message particulier. Million merci! – Crashtor

+0

Glad it helps! @Crashtor –

1

Vous pouvez faire cette requête.

SELECT location, SUM(comments.vote_count + comments.like_count) as total_vote_and_like FROM messages 
JOIN comments ON messages.id = comments.message_id 
GROUP BY messages.location 

Pour ActiveRecord:

@votes_by_place = Message.select("messages.location, SUM(comments.vote_count + comments.like_count) as total_vote_and_like")joins(:comments).where(user_id => @user.id).group("messages.location") 

J'espère que cela vous aidera.

Vous pouvez aller à ce lien pour obtenir le détail http://sqlfiddle.com/#!9/65bb32/6.

+0

Salut. Merci beaucoup pour cela. Cependant, 'comments' est absent de la clause FROM ... – Crashtor

+0

Je pense que je l'ai eu à travailler en utilisant des jointures (: commentaires) Cependant, lorsque je tente de sortie dans la vue, il imprime uniquement '# ' – Crashtor

+0

Non .. Ceci résume tous les commentaires qui ont la même @ user.id .. Pas les commentaires dans chaque 'message.location' – Crashtor