HiveBrain v1.2.0
Get Started
← Back to all entries
patternrubyrailsMinor

A conditional active record query

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
recordqueryactiveconditional

Problem

I have a conditional active record query that checks to see if a relationship of type X exists (.count > 0) where attribute x and attribute y match specific input or if they match when attribute x and attribute y are switched.

I currently use an || operator with two long active record queries to cover both situations.

def coach_of?(user)
  if UserRelation.where(relation_type: 'coach-student').where(user_id: self.id).where(with_user_id: user.id).count > 0 || 
     UserRelation.where(relation_type: 'coach-student').where(user_id: user.id).where(with_user_id: self.id).count > 0
    true
  else
    false
  end
end


Is there a more clever way to do this or is this kind of query acceptable?

Solution

Some notes:

-
if boolean then true else false end -> boolean.

-
UserRelation.where(user_id: self.id).where(with_user_id: user.id) -> UserRelation.where(user_id: self.id, with_user_id: user.id)

-
active_record_collection.count > 0 -> active_record_collection.exists?

-
I don't understand why you have to check both ways, a "coach - student" relationship looks unidirectional.

Anyway, if you set up the coach_students association, you may write something like this:

def coach_of?(user)
  coach_students.where(with_user_id: user).exists? || 
    user.coach_students.where(with_user_id: self).exists?
end

Code Snippets

def coach_of?(user)
  coach_students.where(with_user_id: user).exists? || 
    user.coach_students.where(with_user_id: self).exists?
end

Context

StackExchange Code Review Q#60472, answer score: 2

Revisions (0)

No revisions yet.