理解しやすいように、ブログの例に簡略化できる ActiveRecord クエリを作成しようとしています。特定のユーザーがコメントを残していないすべてのブログ投稿を見つけるにはどうすればよいでしょうか?
現在のクエリは、コメントの一部が特定のユーザーによるものでない限り投稿を返しますが、コメントのいずれかがそのユーザーによって書かれたものである場合はブログ投稿を除外する必要があります。何か案は?
理解しやすいように、ブログの例に簡略化できる ActiveRecord クエリを作成しようとしています。特定のユーザーがコメントを残していないすべてのブログ投稿を見つけるにはどうすればよいでしょうか?
現在のクエリは、コメントの一部が特定のユーザーによるものでない限り投稿を返しますが、コメントのいずれかがそのユーザーによって書かれたものである場合はブログ投稿を除外する必要があります。何か案は?
最も適切な SQL 構文は、「存在しない」句です。外部結合もよく使用されますが、これは歴史的な理由による傾向があります。RDBMS クエリ オプティマイザーは、多くのレコードを含むクエリの最適化があまり得意ではなかったためです。
現在、まともなオプティマイザは、バルク データのハッシュ アンチジョインのような適切なものを使用して、存在しないクエリを実装できます。
クエリは...
select *
from posts
where not exists (
select null
from comments
where comments.post_id = posts.id and
comments.user_id = 38)
レールで言えば...
Post.where("not exists (select null from comments where comments.post_id = posts.id and comments.user_id = #{user.id}")
アップデート:
Rails のより良い構文:
Post.where.not(Comment.where("comments.post_id = posts.id").where(:user_id => user.id)).exists)
Post.joins("LEFT JOIN comments ON posts.id = comments.post_id AND user_id = #{user_id}").where("comments.id IS NULL")