I have a fairly straightforward query that I can’t seem to get right….
My model:
- User – has many Friendships (with other users)
- User – has many submissions
- User – has many comments
- User – has many votes
I need a count that represents
All current_user’s friends, whose submissions, comments or votes created_at dates are > current_user.last_refresh_date
Right now, I am building up an array by iterating over friendships and adding all submissions, comment and votes. I then re-iterate this built-up array while comparing the dates to determine if the count should be incremented. Not the most ideal solution.
Edit:
@TobiasCohen
Efficient solution. Thanks!
Followup:
I wish to add yet one more count to the present query. I need to count all new comments & votes on the current_user.submissions that are not part of the original count (ie. not a friend).
Psuedo-code :
current_user.submissions.join(:comments, :votes, :friends).where(‘last_activity >? AND friend_id != ?’, current_user.last_refresh_date, current_user.id).count
I can’t quite get the query correct (new to complex queries via active record).
I was going to make it a separate query and then add it to the original count. Can it be absorbed into one query instead of two?
I think you’d get the best results by adding a cache column on User, let’s call it
:last_activity_at, then update this with anafter_createcallback on Submission, Comment and Vote.You could then fetch users simply with: