Basically, I have a Listing model, where each listing has a country id. I need the country name in my search results view. I know I can do @listing.country.name
, but this performs an extra query for each listing in my search results. I'm using Thinking Sphinx, and in my controller I have
@listings = Listing.search(@ts_params).page(page_num).per(limit)
I have tried adding .includes(:countries)
and variations thereof but no luck.
What's the best way to go about this? I want the country data to be fetched in the same query as the listings.
I have exactly the same issue with listing images - it is performing an extra query for every listing to find the image, when surely it can be done in one with joins.
Current v4 syntax is:
Ref: https://freelancing-gods.com/thinking-sphinx/v4/searching.html
I managed to solve this using the :sql hash provided by Thinking Sphinx. I now have the following:
This is correctly retrieving the country name and image name, but I still have a bit of work to do in making it work with the images - I think that will deserve its own question!
Thinking Sphinx provides functionality to eager load associated entities, so for eager loading we don't need to add
[:sql]
. Following is the way to do this.For eager loading associated entities using sphinx.
Are you trying to eager load the associated model (to avoid an N + 1 query problem), or are you trying to load the associated model into fields on the parent model?
If it's the former, you're probably better off forgetting about
:select
and instead of:joins
using:Now you should be able to call
listing.countries
andlisting.listing_images
to access child models, as normal.