ActiveRecordでNOT EXISTSを発行する

  • 31
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

たとえば、ActiveRecordのfind_by_sqlを使わずに下記のようなSQLを発行したいとき、どうしたらいいのか調べてみたのでメモしておきます。

SELECT * FROM users WHERE
  NOT EXISTS (SELECT * FROM user_groups WHERE user_groups.user_id=users.id)

こんなかんじ。

user_table = User.arel_table
group_table = UserGroup.arel_table
condition = group_table[:user_id].eq(user_table[:id])

solo_users = User.where(UserGroup.where(condition).exists.not).all

これで発行されるSQLは次の通りでした。

SELECT `users`.* FROM `users`  WHERE (NOT (EXISTS (SELECT `user_groups`.* FROM `user_groups`  WHERE `user_groups`.`user_id` = `users`.`id`)))

Arelを使ってSQLをわりと直球に置き換えただけなのですが、ActiveRecordのレベルでもうちょっとどうにかできるかも?