2012-04-03 2 views
1

Ich habe ein Post-Modell, und post has_many: Kommentare,: as =>: kommentierbar (polymorph). Ich suche nach einer Möglichkeit, dass ich alle Beiträge abrufen kann, und habe ein virtuelles Attribut auf dem Datensatz, das anzeigt, wie viele Kommentare zu diesem Beitrag gehören.Wie kann ich eine virtuelle "count" -Spalte zu einer ausgewählten Abfrage in Rails hinzufügen?

Ich dachte, dass ich konnte einfach tun:

Post.select("posts.*, count(comments.id) as post_comments").joins(:comments) 

jedoch, dass nur ein Datensatz zurückgibt, mit post_comments auf alle Kommentare in der gesamten Datenbank gesetzt, nicht nur die Zugehörigkeit zur Aufzeichnung ...

Antwort

3

Ich denke, das Problem ist, dass Ihre count(comments.id) nur zählt für die gesamte verbundene Tabelle. Sie können mit einer verschachtelten Abfrage dieses Problem umgehen:

Post.select("posts.*, (SELECT count(comments.id) FROM comments WHERE comments.post_id=posts.id) AS post_comments") 

Sie haben nicht die in diesem Fall müssen sich registrieren, da die Kommentare Tabelle nicht in der äußeren Abfrage verwendet wird.

+0

das ist perfekt – nathanengineer

-1

Ich würde das mit Variablen im Post-Modell tun. 1. Ich würde versuchen, den Post zu finden, nach dem ich irgendwie suche (Sie können es durch welchen Parameter finden, den Sie wollen, unten zeige ich das Beispiel mit der Suche nach dem id param).

@post = Post.find(params[:id]) 

Wenn Sie finden den Beitrag, den Sie gesucht haben, Kommentar Nummer ist preety leicht herauszufinden, versuchen, etwas entlang der Linien von ...

@comments = @post.comments.size 

... wich eine ganze Zahl zurückkehren würde.

5

Eigentlich fehlt Ihnen eine Gruppenklausel. Sie müssen nach Standort gruppieren, andernfalls bricht die count() - Aggregation alles auf einen Datensatz zusammen, wie Sie sehen.

Versuchen Sie folgendes:

Post.select("posts.*, count(comments.id) as post_comments") 
    .joins(:comments) 
    .group('posts.id') 
Verwandte Themen