I have a model, resource, which has_many categories:
has_many :category_resources, :dependent => :destroy
has_many :categories, :through => :category_resources
I have it setup to filter on categories, for a list view:
records =
Resource.includes(:categories).where(“category_resources.category_id” =>
categories)
But I want it to still show all categories for a particular resource
the
listing, rather than just what was searched on.
eg, a resource, apple, has the categories, Food, Fruit, and Red.
If you select the resource Food, it should show:
Name: Apple
Categories: [Food, Fruit, Red]
Instead, I’m just getting:
Name: Apple
Categories: [Food]
What would be the best way to structure my query for this to work?
On 7 March 2013 21:34, [email protected] wrote:
I have a model, resource, which has_many categories:
has_many :category_resources, :dependent => :destroy
has_many :categories, :through => :category_resources
I have it setup to filter on categories, for a list view:
records =
Resource.includes(:categories).where(“category_resources.category_id” =>
categories)
Can you explain in words what you are trying to achieve with the query
above please.
Instead, I’m just getting:
Name: Apple
Categories: [Food]
If you have a Resource in resource, then resource.categories should
always show you all the categories.
Colin
On Thursday, March 7, 2013 9:34:17 PM UTC, [email protected] wrote:
This use of includes combined with the condition makes rails use a join
to
do the include, but, as you’ve found the filtering then filters the
included rows, since everything is done with a single query. I’d try
something like
Resource.joins(:category_resources).where("category_resources.category_id"
=> categories).preload(:categories)
assuming that you want the proloading for performance reasons. This
splits
out the eager loading stuff from the main query.
Fred