Question

I have a 2 models in Rails 4

 course.rb
 has_many :reviews

 review.rb
 belongs_to :course

What is the best way to scope only the courses which have been reviewed? Here are two ways:

 1. scope :with_reviews, -> { joins(:reviews).where(:reviews => { :id => !nil }) }

counter_cache: true in review.rb and

 2. scope :with_reviews, -> { where('reviews_count > ?', 0) }

Is there another better way to do so?

Thx

Was it helpful?

Solution

try this

Course.joins(:reviews).group('reviews.course_id').having('count(reviews.id) > 0')

OTHER TIPS

scope :with_reviews, -> { joins(:reviews).select("DISTINCT courses.*")}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top