2016-02-11 5 views

Antwort

6

Die Abfrage where erlaubt keine Aggregatfunktionen wie zählen darin, die ideale Methode, um dieses Problem anzugehen ist die having Methode.

User.joins(:posts).group('users.id').having('COUNT(*) >= ?', n) 

Dies wird zu

SELECT "users".* FROM "users" INNER JOIN "posts" ON "posts"."user_id" = "users"."id" GROUP BY users.id HAVING COUNT(*) >= n 

abgebildet werden Es gibt eine andere Methode möglich, die unter Verwendung Zähler Cache innerhalb des Post Modell und halten die Zählung als posts_count Spalte auf der Benutzertabelle einfacher ist.

belongs_to :user, counter_cache:true 
User.where('posts_count > ?', n) 

Aber ich ziehe die erste Methode, da es keine DB Änderungen mit sich bringt und ist ziemlich geradlinig

1
User.join(:posts).group('users.id').having('count(user_id) > n') 

Ein anderer Weg, dies zu lösen, ist counter_cache zu verwenden und eine posts_count Spalte auf dem Benutzer hinzufügen Tabelle.

belongs_to :user, counter_cache:true # Inside the Post model 

Dann können Sie diese

User.where('posts_count > ?', n) 
-1

Lass uns versuchen:

User.where('id IN (SELECT user_id 
        FROM posts 
        GROUP BY user_id 
        HAVING COUNT(*) > ? 
       )', n) 
Verwandte Themen