brcebn
brcebn

Reputation: 1722

Reverse merge for an active record

I'm facing an Rails (and finally a pur SQL) issue.

I have 3 tables (models). Event / User / Invitation

class Event < ApplicationRecord
  has_many :invitations
end

class User < ApplicationRecord
  has_many :invitations
  has_many :events, through: :invitations
end

class Invitation < ApplicationRecord
  belongs_to :event
  belongs_to :user
end

I want to list all events where a specific user does not have invitation.

Contraints (very important in my case):

Basically, I would say it's the opposite of a merge, like a merge.not(user.events).

The only solution I found is:

Event.where.not(id: user.events.pluck(:id))

But obviously, I don't like it. 2 queries that might be somehow merge into a single one.

Any idea?

Upvotes: 0

Views: 309

Answers (1)

Sampat Badhe
Sampat Badhe

Reputation: 9075

use select instead of pluck, it will create sub-query instead pulling records from database. Rails ActiveRecord Subqueries

Event.where.not(id: user.events.select(:id))

Upvotes: 3

Related Questions