countメソッドの注意点
以下のコードが発行するSQLはどのようなものになるでしょうか?
User.select(:id, :name).count
以下のようになります。
SELECT COUNT(id, name) FROM users;
これは大抵のDBでSQL構文エラーです。
メジャーなものでいうとPostgreSQLは構文エラーにはなりません。
大抵のSQLのCOUNT関数は引数を1つ受け取るようになっています。
対策
lengthを利用する
User.select(:id, :name).length
この対策が一番現実的だと思います。
どうしてもサンプルのようなselectと組み合わせた時にどうしてもcountじゃないといけないってことはほとんどないと思うので。
selectと同時に使わない
User.count
そもそもselectと同時に利用しなければならないことがおかしいかもです。selectとcountを同時に利用しそうになった時はコードを疑いましょう。
selectの引数を一つにする
User.select("concat(id, "," ,name)").length
冗談です。countを利用するためにわざわざこんなことをする人はまずいないでしょう。
勇気がある人はプルリクしてみてください。きっとコミッターに怒られるでしょう。
最後に
私はDBからデータを取得するテストコードを書いている時にこれに10分ほどハマりました。
この記事がみなさんのハマり解消に役立てばと思います。