2012年5月18日金曜日

rails3でsqlのcountとgroupを同時に利用する

どつぼにはまったので以下にメモ。

環境はruby-1.9.3-p0, rails3.2.2です。

テーブルtestのカラムuser_idでグループ化してデータ件数も一緒に取得したい場合は、普通に考えると以下のようになります。


  Test.group(:user_id).count

実際、上記の記述をすると、以下のような正常なsqlが発行されます。


SELECT COUNT(*) AS count_all, user_id AS user_id FROM tests GROUP BY user_id

しかし、上記のsqlをモデルで発行すると、取得する配列が妙な形になります。戻り値がRecordのクラスで返却されるからですかね?Modelクラスにcount_allというアクセサーを設定してやってもうまくいきませんでした。
試行錯誤した結果、以下のようにやることにしました。


Test.connection.select_all("select COUNT(*) AS count_all, user_id AS user_id FROM tests GROUP BY user_id")

上記では、直接sqlを指定して、配列(Array)でデータを取得しています。
つまりのところ、

ActiveRecordではcountとgroupを同時に利用するsqlなんて想定してないよ!!

ということです。さらに最近わかったことは、

困った時は、ごりごりと生sqlを書くと楽になる

ってことです。美を求めすぎるのは、時間の無駄です。結局

動作すること > 生産性 > きれいなコード

ということですな。なっはっはっは。

でわ。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...