2016-03-27 15 views
-1

mich nach einer Möglichkeit, die folgenden SQL in Rails zu erzeugen (um es einen Umfang zu machen), so dass ich es Kette könnte mit weiteren scopes (zB Article.published.most_comments):Verschachtelte SQL SELECT in Rails 4

SELECT *, cs.count 
FROM articles, (
    SELECT article_id, count(*) 
    FROM comments 
    GROUP BY comments.article_id 
) cs 
WHERE articles.id = cs.article_id 
ORDER BY cs.count DESC; 

ich habe etwas entlang der Linien von Article.joins(:comments).select('*').group('comments.article_id') versucht, aber das erzeugt nicht die gewünschte SQL:

SELECT * FROM "articles" 
INNER JOIN "comments" ON "comments"."article_id" = "articles"."id" 
GROUP BY comments.article_id 

(PSQL): PG::GroupingError: ERROR: column "articles.id" 
     must appear in the GROUP BY clause or be used in 
     an aggregate function 

Und es scheint keine .from Verfahren, bei dem sein ich die verschachtelten SQL SELECT angeben könnte .

Antwort

1

Eigentlich ist es eine .from method:

scope :most_comments, -> { 
    Article.select('*, cs.count').from(
    'articles, (
     SELECT article_id, count(*) 
     FROM comments 
     GROUP BY comments.article_id 
    ) cs' 
    ) 
    .where('articles.id = cs.article_id') 
    .order('cs.count DESC') 
} 

Nicht sicher, ob dies der beste Weg ist, aber es funktioniert ...

Verwandte Themen