ActiveRecordでサブクエリをLEFT JOINする

集計関数の結果を、一覧データに結合して表示したかったのだけれど、どうやればいいのか悩んでしまったので、メモとして残します。
結論を書くと、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でできるかと思ったんですが、複雑になったので、こちらのほうがわかりやすいかなと思いました。


タグ Ruby, Ruby on Rails | パーマリンク.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です