2015-09-14 2 views
0

У меня есть модель Server с has_many: domains. Я хочу заказать мои результаты по количеству доменов, и я не хочу использовать cache_count для этого. Так что я как-лRails select query странное поведение

@servers = @servers.joins(:domains).select('servers.*, COUNT(domains.id) AS domains_count').group('servers.id').reorder('domains_count ASC')) 

У меня есть ошибка no such column: domains_count. Поэтому я проверяю SQL в журнале и становлюсь действительно удивленным

SELECT COUNT(*) AS count_all, servers.id AS servers_id FROM "servers" INNER JOIN "domains" ON "domains"."server_id" = "servers"."id" GROUP BY servers.id ORDER BY domains_count ASC 

Почему это делается? Что я должен сделать, чтобы мой запрос работал?

Спасибо.

UPD: Я ошибся. Этот странный count_all производится на @servers.size (еще ПОЧЕМУ?). Однако все же у меня есть

SELECT servers.*, COUNT(domains.id) AS domains_count FROM "servers" INNER JOIN "domains" ON "domains"."server_id" = "servers"."id" GROUP BY servers.id ORDER BY domains_count ASC 

Который всегда производит только одну запись.

ответ

0

У вас есть столбец в order by, который я угадываю, является расчетной колонкой count(domains.id). Поскольку вы не можете использовать ранее установленный alias, вместо этого вы должны использовать фактическое вычисление.

SELECT COUNT(domains.id) AS domains_count, servers.id 
FROM "servers" INNER JOIN "domains" 
ON "domains"."server_id" = "servers"."id" 
GROUP BY servers.id 
order by COUNT(domains.id) 
-- ORDER BY domains_count ASC --remove this or use an appropriate column, 
-- guessing the ordering should be based on count(*) 
+0

Хорошо, теперь у меня есть 'SELECT "сервера". * FROM "сервера" Inner Join "домены" ON "домены". "Server_id"= "сервер". "Идентификатор" GROUP BY servers.id ORDER BY COUNT (domains.id) ASC', но все равно только одна строка в результате. – Ximik

+0

Сколько строк занимает каждая из таблиц? –

+0

Спасибо за подсказку! У меня была одна запись с 20 доменами, а другие без доменов. Поэтому я должен использовать LEFT JOIN, например, SELECT-серверы. * FROM "серверы" LEFT JOIN "домены" ON "домены". Server_id "=" servers "." Id "GROUP BY servers.id ORDER BY COUNT (домены .id) ASC'. – Ximik