Home > Net >  Rails ActiveRecord - Applying a condition or scope to multiple associations
Rails ActiveRecord - Applying a condition or scope to multiple associations

Time:11-17

Suppose we have the following relations:

class Users < ActiveRecord::Base
  has_many :meetings
  has_many :events
end

class Meetings < ActiveRecord::Base
  scope :is_morning_meeting, -> { where.some.condition }
end

class Events < ActiveRecord::Base
  scope :is_morning_event, -> { where.some.condition }
end

Is there a way for me to grab entire User object, but specify the is_morning_* scope across these associations.

Something like:

class Users < ActiveRecord::Base
  has_many :meetings, -> () { is_morning_meeting if scope.morning_concerns }
  has_many :events, -> () { is_morning_event if scope.morning_concerns }

  scope :morning_concerns
end

used like so:

morning_user = user.morning_concerns

And if I call

morning_user.meetings

it should only return morning meetings

and if I call

morning_user.events

it should only return morning events

This might seem a bit specific, but I'm finding myself cornered here because of a GraphQL resolve flow.

CodePudding user response:

You can define a custom has_many associations with a scope like this:

class Users < ActiveRecord::Base
  has_many :meetings
  has_many :morning_meetings, -> { is_morning_meeting }, class_name: "Meeting"
  has_many :events
  has_many :morning_events, -> { is_morning_event }, class_name: "Event"
end

And can simply call those associations like normal associations:

user.morning_meetings
user.morning_events
  • Related