class Users < ActiveRecord::Base
has_many :meetings, :through => :meeting_participations
has_many :meeting_participations
end
class Meetings < ActiveRecord::Base
has_many :users, :through => :meeting_participations
has_many :meeting_participations
end
class MeetingParticipations < ActiveRecord::Base
belongs_to :user
belongs_to :meeting
scope :hidden, where(:hidden => true)
scope :visible, where(:hidden => false)
end
hidden
is an extra boolean column within the m2m association table. Given some Users
instance current_user
, I want to do
current_user.meetings.visible
which will retrieve a collection of Meetings
for which the user is a participant where the hidden
column is false
. The closest I have gotten is adding the following scope to the Meetings
class
scope :visible, joins(:meeting_participations) & MeetingParticipation.visible
The scope
does filter the Meetings
against the MeetingParticipations
table, however there is no join/condition against the MeetingParticipations
table related to current_user
.
The issue with this is, if current_user
and another_user
are both participants for some Meetings
instance, a Meetings
record in the result set will be returned for each participant that has hidden
set to false
. If current_user
has true
set for hidden
for all Meetings
, if another_user
is a participant in any of those same Meetings with hidden
set to false
, those Meetings
will appear in the Meetings.visible
result set.
Is it possible to have a scope as I've mentioned above which will properly join on the User
instance? If not, can someone recommend a solution to this?
Here's a one liner:
This is great because you can make a scope out of it, a function out of it, or simply call it anywhere. You can also add any more restrictions you want to the hash.
In Rails 4, you can specify the scope originally defined in the child object in the association itself. Short: you don't have to know the internals of the MeetingParticipation model within the User model.
This would allow you to do:
user1.visible_meetings
anduser2.visible_meetings
with different result setsYou could also do:
This is my solution for your problem:
@user.meetings.visible
It would seem to me that it is not sensible to use a scope on Meeting for your purpose. A meeting itself has no visibility, but the participation has. So I would suggest an extension on the association within User:
I hope, this helps.