Rails4: includesで除外をする


Rails4 です。
Personモデルが複数の Emailモデルを持っているという has_many なアソシエーションで、ある特定の email を持っているいる人を除外したい。
とりあえず、除外でなく、持っている人を検索するなら……

@people_with_email = Person.all.includes(:emails).where("emails.email='xxx@xxx.com' or emails.email='yyy@yyy.com').references(:emails)

で良いようだ。
では、除外するには……

@people_except_email = Person.all.includes(:emails).where("emails.email != 'xxx@xxx.com' or emails.email != 'yyy@yyy.com'").references(:emails)

でよいか……どうも良くないみたいだ。
試行錯誤の結果以下のようにした。

ids = Person.connection.select_rows(Person.joins(:emails).where("emails.email = 'xxx@xxx.com' or emails.email = 'yyy@yyy.com'").select("people.id").to_sql)
@people_except_email = Person.all.includes(:emails).where.not(:id => ids).references(:emails)

参考にさせていただいたサイトは以下です。本当に助かりました。ありがとうございます。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中