Re: [Rails] Filter via has_many, but show all has_many objects in result

53 views
Skip to first unread message

Colin Law

unread,
Mar 8, 2013, 3:59:14 AM3/8/13
to rubyonra...@googlegroups.com
On 7 March 2013 21:34, <dcec...@gmail.com> 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.

>
> 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]

If you have a Resource in resource, then resource.categories should
always show you all the categories.

Colin

Frederick Cheung

unread,
Mar 8, 2013, 6:46:39 AM3/8/13
to rubyonra...@googlegroups.com


On Thursday, March 7, 2013 9:34:17 PM UTC, dcec...@gmail.com 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)


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


 
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?
Reply all
Reply to author
Forward
0 new messages