QA@IT

ActiveRecordで「Commentが一件もついていないPost」を検索するには?

2854 PV

PostとCommentというモデルがあり、以下のようにPostがCommentを持っているとします。

class Post < ActiveRecord::Base
   has_many :comments
end

このとき、「Commentが0件のPost」を検索するにはどうすれば良いでしょうか?
Post.joins('LEFT OUTER JOIN comments').where(...) みたいな形で書けるのでしょうか。

回答

おっしゃった解で良いと思いますが、別解として、サブクエリにすると他と干渉少なめなAR::Relationをとれるので、役に立つかもしれません。

where('NOT EXISTS(SELECT 1 FROM comments WHERE comments.post_id = posts.id)')

サブクエリの中身がちょっと剥き出しすぎなのがあれですが。。。

編集 履歴 (1)
  • ありがとうございます。こんな書き方もできるのですね。 -

自己解決しました。以下でいけました。OUTER JOINのときはONを自分で書かないといけないんでした。

Post.joins('LEFT OUTER JOIN comments ON comments.post_id = posts.id').
  where('comments.id IS NULL')

#余談ですが、Squeelというgemを使うと

Post.joins{ comment.outer }.where('comments.id IS NULL')

みたいに書けるようです。AR標準でもPost.joins(comments: :outer)とか書けるようにならないかなぁ。
http://labs.timedia.co.jp/2013/11/activerecord4sql-squeel.html

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。