Fetch record based on many to many association


Let’s say I have three models, Company, User and Entry (and a join model EntryParticipants).

Company has many Users, a User has many Entries (Entries created by a User).

Also, there is another many-to-many relationship between User and Entry (a User can participate in many entries and an Entry can have many participants).

So, now I want to fetch all Entries that a User has created OR is participating in. I’m a bit stuck though…

user.entries => All entries created by this user

user.participated_entries => All participated entries

But now I want to get them all in one query. The code below is working, but is there a more efficient way to do it?

scope.includes(:entry_participants).where("(entry_participants.participated_entry_id = entries.id) OR entries.user_id = ?", user.id)

Why bother and not doing:

(user.entries + user.participated_entries).uniq

I wonder if a complicated single query is must faster…

If it makes sense for your domain model, adding some logic to enforce that the user who created the Entry is always also a participant makes this trivial.

–Matt Jones