集計関数の結果を、一覧データに結合して表示したかったのだけれど、どうやればいいのか悩んでしまったので、メモとして残します。
結論を書くと、ActiveRecord::Relationからto_sqlで文字列としてサブクエリを取得して、joinsで繋げました。
Railsのバージョンは4.1.8, postgresqlでやってます。
例えば、ユーザーのコメント数をカウントし、コメントの多い順に並び替えるにはこうします。
comment_counts = Comment.group(:user_id).select("user_id, COUNT(id) AS comment_count") users = User.joins("LEFT JOIN (#{comment_counts.to_sql}) comment_data ON users.id = comment_data.user_id") # COALESCE関数で初期値を設定するようにした。 users = users.select("users.*, COALESCE(comment_data.comment_count, 0) AS comment_count"). reorder("comment_count desc")
Arelでできるかと思ったんですが、複雑になったので、こちらのほうがわかりやすいかなと思いました。