ActiveRecordにてGROUP BYのCOUNTを取りたいとき、他の記事を参考に以下のようなコードを書いたのですが、
Article
.where(is_published: true)
.group(:id)
.order(:count_all)
.count
(例文なので全く意味のないクエリですが、本来はjoinsとか色々やって集計してます)
このorder(:count_all)のcount_allがどこから来たのか分からず、調べてもわからなかったのでメモとして残しておきます。
結論
結論として、このcount_allというカラム名は、引数なしの.countを呼び出した時にASとして追加されるCOUNT(*)のエイリアス名を指定しています。
今回のクエリは最後に引数なしの.countという集計関数を呼び出していますが、これがないとorder(:count_all)は機能しません。
実際に吐かれるSQLを見た方が早そう。
SELECT
COUNT(*) AS count_all,
[Article].[id] AS article_id
FROM
[Article]
WHERE
[Article].[is_published] = 1
GROUP BY
[Article].[id]
ORDER BY
[count_all] ASC
このように、たんに.groupのみを行なったカラムにはASでテーブル名+カラム名が、.countを用いた場合にはcount_allというエイリアスが指定されています。
もうわかると思いますが、ちなみに.count(:id)など引数にカラムを追加した場合のエイリアス名はcount_idになります。
最後に
ちゃんと理解せずにググりながらORMをガチャガチャしていたのでcount_allが何なのかよくわからずになってしまったのですが、ちゃんと吐き出されるSQLと見比べながらやったら一発でわかる疑問でした。
普通のSQLを書く時は自分でエイリアスを設定するし、感覚的にorder_byのあとにcountが来ることはないので、慣れていないと脳がバグりがちですが頑張りたいです。