2017-07-11 2 views
0

Ich verwende ein einfaches Follower-System in meiner Anwendung und kann die Anzahl der Follower eines Benutzers ermitteln, indem ich User.followers.count ausführen. Wenn ich jedoch versuche, alle Benutzer nach der Anzahl der Follower zu sortieren, die sie jeweils mit @orderedUsers = User.all.order("followers.count DESC") haben, wird der Fehler "ActiveRecord :: StatementInvalid: SQLite3 :: SQLException: no this column: followers.count" zurückgegeben. Offensichtlich liegt das daran, dass es keine solche Spalte gibt. Gibt es eine Möglichkeit, dies zu umgehen, um das zu erreichen, was ich erreichen möchte?Benutzer nach Anzahl der Follower sortieren

Danke.

Antwort

1

Wie wäre es so etwas wie:

@ordered_users = User.all.sort{|a,b| a.followers.count <=> b.followers.count} 

Für die umgekehrte Reihenfolge, die Sie tun können:

@ordered_users = User.all.sort{|a,b| b.followers.count <=> a.followers.count} 

Oder .reverse, wie Sie in den Kommentaren sagen.

BEARBEITEN: @Alex Quach verließ eine gute Alternative in einem anderen Beitrag. Ich habe es geändert für, wo es nicht den aktuellen Benutzer in der Liste enthalten, die hilfreich sein können:

User.all.where('id != ?', current_user.id).sort_by { |u| -u.followers.count }

+1

Vielen Dank! Alles, was ich tun musste, war 'reverse' an das Ende zu fügen, um es in absteigender Reihenfolge erscheinen zu lassen. Vielen Dank für Ihre Hilfe :) – Collin

+0

@Collin Sie können die Zählungen tauschen, um die Sortierung umzukehren. Keine Notwendigkeit, das sortierte Array umzukehren. –

+0

@ReinHenrichs - guter Punkt, danke. Ich weiß auch nicht, ob dies in einer einzelnen Codezeile möglich ist oder nicht, aber wie würde ich die obersten 100 in dieser Liste ermitteln und dann 5 willkürlich aus dieser Liste auswählen? Ich habe mich umgesehen und bin völlig verloren, ob das erreicht werden kann oder nicht. – Collin

3

Dieser Code sollte funktionieren (die DB-Tabellennamen sind Benutzer und Anhänger vorausgesetzt):

0

Ich würde stark überlegen, einen Zähler-Cache auf das Benutzermodell zu verwenden, um die Anzahl der Follower zu halten.

Dies würde eine sehr geringe Auswirkung auf die Leistung auf Hinzufügen oder Entfernen von Anhängern geben, und die Leistung erheblich steigern, wenn Arten durchführen:

Diese
User.order(followers_count: :desc) 

besonders auffällig wäre, wenn Sie die Top-n-Benutzer von Folger zählen wollte, oder Suche nach Benutzern ohne Follower.

Verwandte Themen