5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ActiveRecord::StatementInvalid: Mysql2::Errorが発生するcountメソッドのケース

Posted at

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分ほどハマりました。
この記事がみなさんのハマり解消に役立てばと思います。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?