2017-09-07 3 views
-4

Benutzer hat viele Kommentare und Kommentare gehören dem Benutzer. Die Kommentartabelle hat eine Statusspalte vom Booleschen Typ.Schienen hat viele aktive Datensatzabfrage

Jetzt möchte ich Benutzer erhalten, deren letzter Kommentar den Status wahr hat.

Wie kann dies in ActiveRecord Abfrage durchgeführt werden?

Antwort

0
@user_ids = Comment.where(status: true).pluck(:user_id) 

Dann

User.where(id: @user_ids) 

Ansonsten einen Join verwenden, um die Felder von Benutzern Ihnen alle und für jedes Ergebnis Kommentar geben.

Comment.joins(:user).where(user_id: @user_ids) 
+0

Nicht die richtige Antwort, weil ich Frage Modell nirgends wo erwähnt habe. Ich möchte auch, dass die Benutzer diese letzten Kommentar hat den Status false. –

0
users = [] 
User.all.each do |user| 
    users << user if user.comments && user.comments.last.status 
end 

users # list of all user whose last comment status = true 

users Objekt bestehen alle Benutzer, deren letzte Kommentar Status ist wahr.

+0

Ich möchte eine Schiene aktive Datensatzabfrage keine Schleife. –

+1

@AnandShrivastava basierend auf Schienen führen, das ist die richtige Antwort (wenn es funktioniert). Dies ist eine Abfrage zum Abrufen mehrerer Objekte in Batches Bitte erläutern Sie uns auch, warum Sie eine aktive Datensatzabfrage und keine Schleife benötigen http://guides.rubyonrails.org/active_record_querying.html#retrieving-multiple-objects-in-batches –

+0

Da es offensichtlich ist, dass Schleife im Vergleich zu aktiven Datensatzabfrage mehr Zeit braucht, und ich halte es nicht für gute Praxis, wenn so viele Benutzer wie 10000 usw. dann Ladezeit mehr sein werden. macht das Sinn? –

0

Sie könnten diese Abfrage versuchen (erhalten Benutzer diejenigen letzten Kommentar hat den Status wahr)

User.joins(:comments) 
    .where('comments.created_at = (SELECT MAX(comments.created_at) FROM comments WHERE comments.user_id = users.id)') 
    .where('comments.status = true') 
    .group('users.id') 

Dies erfordert tatsächlich eine Sub-Abfrage, so die Idee zuerst alle Benutzer letzten Kommentar zu holen und mit dem Status Ausfiltern als true, um die Benutzer-ID mit Hilfe von Join herauszufinden.

Verwandte Themen