どつぼにはまったので以下にメモ。
環境は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 件のコメント:
コメントを投稿