Eager Load for Samples of Data to Count Relations in Rails
Sometimes you might want to load samples (shuffled) of a related model that matches certain criteria. For hitchi.de I wanted to display all Cities that have offers in the next to days. In order to limit the query load I used Rails’ includes() method and hacked it a little to best match my needs.
If you need to count relations more often or you can expect your data to be huge, better make use of Rails’ built-in :counter_cache
def quickclick # grab all related departures from Offer # Offer belongs to Departure # Departure has many Offers # use only Offer.departure_id (using "pluck()") @tomorrowsrides = Offer.includes(:departure).where(seek: false).where("departuredate < ?", (Date.current + 3.days)).pluck(:departure_id) # this spits out an array with the mathing ids of Departure # to make use of this, I first check their uniqueness # then shuffle the array and grab the first 20 values @tomorrowsrides = @tomorrowsrides.uniq.shuffle.first(20) # I can now load 20 shuffled samples from the related model @tomorrowsrides = Departure.where(id: @tomorrowsrides).includes(:offers).shuffle # In the view I was then able to run # a low profile count operation on the objects end
⬅️ Read previous