2017-08-09 4 views
1

Ein Message hat die Attribute location, like_count, vote_count.Wie Eltern- und Kind-Datensatz gruppiert werden?

Und ein Commentbelongs_to :message und hat die Attribute like_count, vote_count

Ich habe, um herauszufinden, verwaltet wie die location zusammen mit der Anzahl der Stimmen Hash aus den Message in diesen speziellen location gegeben wurde.

@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 

ich es einfach so halten konnte und es wäre in Ordnung, aber ich würde wirklich lieben es wirklich, wenn ich einen Weg finden könnte die vote_count und like_count von comments mit user_id => @user.id und in einem bestimmten @message.location zusammenzufassen

Damit es werden würde:

# => "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 

Vielleicht wäre es einfacher, wenn ich location zu Comments auch zugewiesen?

Lassen Sie mich wissen, was Sie denken und irgendwelche Vorschläge würden sehr geschätzt werden!

Antwort

1

Ich bin mir nicht sicher, wie dies in einer einzigen Abfrage zu tun, aber mit zwei Abfragen und ein wenig einfacher Ruby kann getan werden. Vielleicht kann jemand anderes einen effizienteren Weg finden.

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') 

Diese erste Abfrage fügt alle der like_count s und vote_count s von beiden messages und comments Tabellen für messages die comments zugeordnet haben. Die Verwendung von left_outer_joins stellt sicher, dass der Aufruf an group Hash-Schlüssel für alle Nachrichtenspeicherorte hinzufügt, einschließlich derer, die keine Kommentare enthalten, sodass alle Nachrichtenspeicherorte des Benutzers dargestellt werden.

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') 

Diese zweite Abfrage fügt alle der like_count s und vote_count s nur von der messages Tabelle für messages die comments haben nicht verbunden.

totals = with_comments.dup 

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

dup der erste hash und iterieren es, die Werte der beiden Hashes Aufaddieren und Umwandeln nil Werte 0.

+0

Ich habe es endlich geschafft, das zum Laufen zu bringen. Egal, ob es einen besseren Weg gibt, dies ist die richtige Antwort. Dies umfasst alle Aspekte, wenn es eine Nachricht gibt, die keinen Kommentar hat, und alle Kommentare, unabhängig davon, ob sie zu einer bestimmten Nachricht gehört. Tausend Dank! – Crashtor

+0

Froh, dass es hilft! @ Crashtor –

1

Sie können diese Abfrage durchführen.

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 

Für Active:

@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") 

Ich hoffe, dies wird Ihnen helfen.

Sie können zu diesem Link gehen, um Details zu erhalten http://sqlfiddle.com/#!9/65bb32/6.

+0

Hey. Vielen Dank dafür. "Kommentare" fehlt jedoch FROM-Klausel ... – Crashtor

+0

Ich denke, ich habe es funktioniert mit Joins (: Kommentare), aber wenn ich versuche, es in der Ansicht auszugeben, druckt es nur # # Nachricht: 0x007fd3a41c8fc0> ' – Crashtor

+0

Nein. Dies summiert alle Kommentare, die die haben selbe @ user.id .. Nicht die Kommentare in jedem 'message.location' – Crashtor

Verwandte Themen